2013-06-02 37 views
3

我有一個數組散列,我想按數組大小對它們進行排序。如何按數組大小對數組的散列進行排序

這是到目前爲止我的代碼:

use strict; 
use warnings; 

my %hash_array = (
    "array_1" => ["apple", "ball", "cat"], 
    "array_2" => ["def", "leppard", "rocks", "too"], 
    "array_3" => ["italian", "pastry", "missing", "cherry", "top"], 
); 

# Length of array_1 
my $array_1_size = @{$hash_array{"array_1"}}; 
print "Should print three: $array_1_size\n"; 

# Found this here: https://stackoverflow.com/questions/15722286 
# But my result remains unsorted 
foreach my $key (sort { $hash_array{$b} <=> $hash_array{$a}} keys %hash_array) { 
    print "key: $key\n"; 
} 

我知道如何獲得一個獨立的數組的大小,但我不知道如何,結合具有排序功能。

我從here複製了最後一個foreach塊,但該解決方案對我無效,因爲我的輸出沒有排序。我有一些關於最後一塊代碼的問題:

  1. 我沒有看到前面引用的$ b和$ a。這是一個內置的參考,分類功能理解?
  2. 該解決方案似乎已經爲原始海報工作,但它不適用於我的情況。然而我們最初的目標是相似的。我爲了獲得基於數組大小的有序輸出而丟失了什麼?
  3. 根據數組大小以升序和降序排列數組散列的最佳方法是什麼?
+0

如果你看一下你提到的問題,海報上寫着*「我不知道這是爲什麼不工作」 *有關你複製的代碼。他接受的答案是你應該複製的內容。 – Borodin

回答

5

你很近。正如所寫的,您正在比較數組引用,它們是更多或更少的內存地址。我修改你的代碼稍微給你,你找什麼:

foreach my $key (sort { scalar(@{$hash_array{$b}}) <=> scalar(@{$hash_array{$a}}) } keys %hash_array) { 
    print "key: $key\n"; 
} 
+0

非常好!我知道這是一件小事。謝謝:) –

+2

當'<=>'運算符應用標量上下文時,不需要調用'scalar'。 '@ {$ hash_array {$ b}} <=> @ {$ hash_array {$ a}}'很好。 – Borodin

4

排序函數就是 - anonymous子類。你不限於一次比較,你只需要返回-1,0或1的結果。是的,$a$b是比較的兩個值 - 它們可以是標量或引用。

您可能會解決你的問題是這樣的:

foreach my $key (sort { 
         my $length_a = scalar @{$hash_array{$a}}; 
         my $length_b = scalar @{$hash_array{$b}}; 
         $length_b <=> $length_a 
         } keys %hash_array) { 
    ... 
} 

我知道,可以減少到一個班輪,但關鍵是要展示你怎麼能有比sort子裏面一個比較詳細。

+0

無用的'scalar'。 – ikegami

+0

有意無用的用於教育目的。 :-)我看到接受的答案恰恰是我的答案,沒有任何語境或解釋。 – RET

1
for my $key (sort{ my ($x,$y)[email protected]_array{$a,$b}; @$y <=> @$x } keys %hash_array) { 

    print "key: $key\n"; 
}