1

次のサンプル値を持つ perl 配列があります。

multiple_sizes[0] = 10' 0" x 14' 0":6342
multiple_sizes[1] = 2' 0" x 3' 0":0
multiple_sizes[2] = 4' 0" x 6' 0":829
multiple_sizes[3] = 6' 0" x 9' 0":2022
multiple_sizes[4] = 8' 0" x 10' 0":3145
multiple_sizes[5] = 9' 0" x 12' 0":4821

オブジェクトは、幅の昇順でこれらの値をソートすることです。問題は、10' 0" が 2' 0" の前にソートされ、さらに (図示されていません)、2' 10" が 2' 6'' の前にソートされることです。

結果が昇順の幅になるように配列をソートする方法はありますか? 幅を 2 ​​桁の数字として扱う方法があり、2 番目の数字が存在しない場合は 1 としてソートされるのではないかと考えていました (つまり、2' は 02' になり、10' は 10' のままです)。

どんな助けでも大歓迎です。

4

1 に答える 1

6

問題の最善の解決策は、すべての帝国単位をメートル法に変更することです。

それを除けば、シュワルツ変換を使用できます。インチとフィートに対応する文字列の最初の 2 つの数値を取得して保存し、並べ替えで使用するだけです。

use strict;
use warnings;

my @size;
$size[0] = qq#10' 0" x 14' 0":6342#;
$size[1] = qq#2' 0" x 3' 0":0#;
$size[2] = qq#4' 0" x 6' 0":829#;
$size[3] = qq#6' 0" x 9' 0":2022#;
$size[4] = qq#8' 0" x 10' 0":3145#;
$size[5] = qq#9' 0" x 12' 0":4821#;

@size = map $_->[0],
    sort { $a->[1] <=> $b->[1] || $a->[2] <=> $b->[2] }
    map { [ $_, /^(\d+)'\s+(\d+)"/ ] } @size;

print "$_\n" for @size;

出力:

2' 0" x 3' 0":0
4' 0" x 6' 0":829
6' 0" x 9' 0":2022
8' 0" x 10' 0":3145
9' 0" x 12' 0":4821
10' 0" x 14' 0":6342
于 2013-08-15T00:48:52.290 に答える