2010年9月23日 星期四

Sorting hash

in Hash
Assuming the hash is ("aaa" => 10, "bbb" => 60, "ccc" => 20)
foreach my $key (sort {$repeatRank{$b} <=> $repeatRank{$a}} (keys (%repeatRank)))
{
print $key $repeatrank{$key}
}

使用 sort( Algorithm Array)
Algorithm is {$repeatRank{$b} <=> $repeatRank{$a}}
1. Hight to lower (decreasmemt)
2. Using the <=> sysmbol represent the number comparsion

Array (keys %repeatRank)
is return the array content

---------------------------------------------

my %hash = (john, 24, mary, 28, david, 22);
my @order = sort { $hash{$a} <=> $hash{$b} } keys %hash;
print @order; # 依序是 david john mary


雖然只有三行程式,不過我們還是應該來解釋一下其中到底發生了甚麼事,否則看起來實在讓人有點頭暈。第一行的問題應該不大,或者說如果你第一行看起來有點吃力,那你可能要先翻回去看看雜湊那一章,至少你應該要懂得怎麼定義一個雜湊,然後指定雜湊的鍵跟值。這裡所用的方式一點也不特別,我們只是用串列來賦值給一個雜湊。最複雜的應該是第二行 (除非你覺得最後一行要印出一個陣列對你而言太過困難),我們先看等號左邊,那裡定義了一個陣列,因為我們希望可以得到一個依照雜湊值排序過的雜湊鍵陣列。這聽來好像不難,讓我們先想像一下,我們該怎麼取得這樣的陣列呢?
首先我們應該先拿到包含所有雜湊鍵的陣列,也就是利用keys這個函式取得的一個陣列。拿到這個陣列之後,我們就可以來進行排序了。排序的重點在於區塊內的那一小段程式。我們還是使用了Perl預設的兩個變數,也就是$a跟$b,分別代表從陣列(keys %hash)拿出來準備比較的兩個數值。部過我們並不是直接對變數$a,$b進行比較,而是以他們為鍵,而取的雜湊值來進行排序


---------------------------------------------
Reference:

perl learn: http://perl.hcchien.org/ch12.html
web teacher: http://devdaily.com/perl/edu/qanda/plqa00016/

沒有留言:

張貼留言