2012-04-25 119 views
4

僞代碼:的Perl:排序基於特定列多列的二維陣列

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

最終sortedArray應當基於COL-2(整數),照顧1對1的關係的排序與「人的名字」(col-1)。最終的結果應該是這樣的:

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

'@array = {...}'(幾乎總是)不正確的語法。使用'@array =(...)'分配給一個數組。 – mob 2012-04-25 15:09:20

+0

@mob:我想知道當你提到幾乎*時你有什麼邊緣情況?:) – Zaid 2012-04-25 16:08:27

+0

@Zaid:'@array_containing_a_single_hashref = {...}' – mob 2012-04-25 16:10:41

回答

7

你可以給一個謂詞sort,那就是:這是評價比較列表的元素的功能。

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

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

在謂詞(在大括號中的表達式),並且$a$b被比較的外列表中的元素。

sort只關心一維列表,所以它不會混淆外部列表元素的內部結構。所以姓名和號碼之間的關係可以毫不費力地保留下來。

有關更多詳細信息,請參閱perldoc -f sortperldoc perlop

+0

my @sorted = sort {$ a - > [1]> $ b - > [1]} @unsorted; 更容易理解 – askovpen 2012-04-25 15:33:13

+0

謝謝。有效。我只是使用「排序」,這是排序第二列。 – Mike 2012-04-25 15:33:16

+1

@Mike沒有那麼錯 - 香草'sort'的謂詞更像'{「$ a」cmp「$ b」}',所以你會比較''ARRAY(0x2229d48)「'和'' ARRAY(0x2229d98)「'。任何與第二列的排序相似都是巧合。 – mob 2012-04-25 16:08:22

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)密鑰提取成本變更高,並且更優選的是提取每個值的「分類鍵」僅一次,這是nsort_by所做的。

+2

另請參閱:[Sort :: Key](http://p3rl.org/Sort::Key) – daxim 2012-04-25 21:38:44