5

擬似コード:

my @unsortedArray = { ["Harry", 10], ["Tim", 8], ["Joe", 3]};
my @sortedArray = ?????

最終的な sortedArray は、「人の名前」(col-1) との 1 対 1 の関係を考慮して、col-2 (整数) に基づいてソートする必要があります。最終結果は次のようになります。

sortedArray should be { ["Joe", 3], ["Tim", 8], ["Harry", 10] }; 
4

2 に答える 2

8

sortリストの要素を比較するために評価される関数に述語を与えることができます。

my @unsorted = ( ["Harry", 10], ["Tim", 8], ["Joe", 3] );

my @sorted = sort { $a->[1] <=> $b->[1] } @unsorted;

述語 (中括弧内の式) では、$a比較$bされる外側のリストの要素です。

sortは 1 次元リストのみに関係するため、外部リストの要素の内部構造を台無しにすることはありません。そのため、名前と番号の関係は簡単に保持されます。

perldoc -f sort詳細については、 およびを参照しperldoc perlopてください。

于 2012-04-25T15:20:17.080 に答える
2

特に大規模なアレイの場合、より効率的な解決策は次を使用することList::UtilsBy::nsort_byです。

use List::UtilsBy qw( nsort_by );

my @unsorted = ( ["Harry", 10], ["Tim", 8], ["Joe", 3] );

my @sorted = nsort_by { $_->[1] } @unsorted;

小さなケースではオーバーヘッドに気付かない可能性がありますが、より複雑な関数の場合、O(n log n)キー抽出コストが高くなり、各値の「ソートキー」を1回だけ抽出する方が望ましいですnsort_by

于 2012-04-25T16:09:25.757 に答える