2013-03-18 137 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