2012-04-25 10 views
4

擬似コード:たPerl:特定の列に基づいて複数の列を有する2次元配列のソート

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

最終sortedArrayがCOL-2(整数)、1対1の関係の世話に基づいてソートされるべきです「人の名前」(col-1)を入力します。リストの要素を比較するために評価された機能:あなたはつまり、sortに述語を与えることができ

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

'@array = {...}'は、(ほとんどの場合)間違った構文です。配列に代入するには '@array =(...)'を使います。 – mob

+0

@モブ:あなたが*ほとんど*をコメントしたときに思いついたのは、どのような場合でしょうか? – Zaid

+0

@Zaid: '@array_containing_a_single_hashref = {...}' – mob

答えて

7

:最終的な結果は次のようになります。

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

my @sorted = sort { $a->[1] <=> $b->[1] } @unsorted; 
述語(中括弧内の式)において

$a$b比較される外側のリストの要素です。

sortは、1次元リストにのみ関係するので、外側のリストの要素の内部構造が混乱することはありません。したがって、名前と番号の関係は簡単に保持されます。

詳細はperldoc -f sortperldoc perlopを参照してください。

+0

my @sorted = sort {$ a - > [1]> $ b - > [1]} @unsorted; 分かりやすい – askovpen

+0

ありがとうございます。出来た。私はちょうど2番目の列をソートしている "並べ替え"を使用していた。 – Mike

+1

@Mike noそれは間違っています - バニラ 'sort'の述語は' {"$ a" cmp "$ b"} 'のようになりますので、' 'ARRAY(0x2229d48)' 'と' ARRAY(0x2229d98) "。 2番目の列の並べ替えとの類似点は偶然です。 – mob

1

特に大きなアレイのためのより効率的なソリューション、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の処理です。

+2

参照:[Sort :: Key](http://p3rl.org/Sort::Key) – daxim

関連する問題