【Perl】シュワルツ変換のメモ

Perlでコーディングしてたら「シュワルツ変換」の書き方を思い出せなかったのでメモしておきます。

シュワルツ変換の例

下記はWikipediaに掲載されているコード例です。

@sorted = map  { $_->[0] }
          sort { $a->[1] cmp $b->[1] or $a->[0] cmp $b->[0] }
          map  { [ $_, length($_) ] }
               @unsorted;

やってる処理は元の配列(@unsorted)に入ってる文字列の長さで比較して、長さが同じなら文字列で比較、並び替えができた配列(@sorted)を得ています。

この処理の利点は複雑なソートをする際に、一時的な配列を用意しなくて良いことです。

処理は下から見る

シュワルツ変換は下の行から読んでいくことになります。

  1. 4行目、文字列が入っている並び替え前の配列(@unsorted)を3行目のmapに渡している。
  2. 3行目、無名配列([])に配列に入ってる文字列と、length関数で得た文字列の長さを格納する。
  3. 2行目、無名配列の1番目の文字列の長さで比較、長さが同じなら無名配列の0番目に入っている文字列で比較する。
  4. 1行目、無名配列の0番目に入っている文字列を、結果の配列(@sorted)に入れる。

並び替え前の配列を残す必要が無ければ、@unsorted = map { … } sort { … } map { … } @unsortedとしても良い。

またすぐに忘れる

書き方を忘れても「シュワルツ変換」という言葉だけを覚えていれば、検索して書き方を思い出せる。「シュワルツ変換」という言葉は忘れないように。


UliSchuによるPixabayからの画像を使用しています。