2013-03-18 103 views
3

假設我有一個散列,其中,鍵/值對是如下:參考陣列和訂單

Name Scores 
Bob 67 89 77 89 
Kim 99 98 95 90 
Dan 67 90 73 88 
    . . .goes on 

鍵是名稱和值是測試成績。現在這些值是指數組。

我知道散列函數有一個排序函數,但假設我想找到每個學生的中值分數。

最終輸出:

Name Median 
Bob 83 
(. . .and so on) 

要找到中間,我需要先放置在得分最低,以最高幅度。
有散列的排序功能,我可以爲每個學生排列測試分數嗎?

謝謝你的幫助。

+0

+1以及格式化1日問題 – 2013-03-18 23:38:22

回答

3

內建sort可以排序的唯一事情是標量的列表;它無法對哈希進行排序。實際上,對散列進行排序是不可能的。相反,一個排序的密鑰的散列。人們可以輕鬆地對數組的索引進行排序,但這種間接性在這裏完全沒有必要。

你有一個數字列表,你想排序的數字列表,而無需任何外部信息。

my @sorted_scores = sort { $a <=> $b } @scores; 

這就是說

my @sorted_scores = sort { $a <=> $b } @{ $scores{'Bob'} }; 

中位數是

my $mid_idx = int(@sorted_scores/2); 
my $median = @sorted_scores % 2 
    ? $sorted_scores[$mid_idx] 
    : ($sorted_scores[$mid_idx-1] + $sorted_scores[$mid_idx-0])/2; 
+0

哇,這是快。感謝您的幫助。我知道我可以將每個評分標識爲$ hash {$ student} [index number],對吧?但是,如果我希望輸出在訂購後給我名稱和一個特定的分數,我將如何使用它? – Hipale 2013-03-18 23:53:39

+0

哪個具體評分? – ikegami 2013-03-19 00:01:28

+0

散列中四個中的最高分數。我需要定義索引嗎? (或者我可以用0代替索引號,就像我上面所說的那樣?) – Hipale 2013-03-19 00:02:56