哈希排序一般有两种情况,一种是根据键来排序,一种是根据值来排序。一般情况下,键多见于是字符串,而值多见于数字。在哈希的排序里同样可以使用 sort 和 reverse 两个函数。比较字符串的子程序里使用 cmp,比较数值的字符串里使用飞碟运算符 <=> 。
考虑下面代码:
[Perl] 纯文本查看 复制代码 #!/usr/bin/perl
%result = (
"Jim" => 50,
"Tom" => 38,
"Ken" => 68,
"Lin" => 87,
"Win" => 100,
);
foreach $key (sort(keys %result)) {
printf "%s%5d\n", $key, $result{$key};
}
#反序
print "\nReverse order:\n";
foreach $key (reverse sort(keys %result)) {
printf "%s%5d\n", $key, $result{$key};
}
print "-----------------------\n";
sub ascending_sort {
$result{$a} <=> $result{$b};
}
sub descending_sort {
$result{$b} <=> $result{$a};
}
foreach $key (sort ascending_sort(keys(%result))) {
printf "%s%5d\n", $key, $result{$key};
}
print "Descending sort by result: \n";
foreach $key (sort descending_sort(keys(%result))) {
printf "%s%5d\n", $key, $result{$key};
}
运行输出:$ ./sorthash.pl
Jim 50
Ken 68
Lin 87
Tom 38
Win 100
Reverse order:
Win 100
Tom 38
Lin 87
Ken 68
Jim 50
-----------------------
Tom 38
Jim 50
Ken 68
Lin 87
Win 100
Descending sort by result:
Win 100
Lin 87
Ken 68
Jim 50
Tom 38 程序中,$a 和 $b 是特殊变量,负责比较来自哈希 %result 的值。<=> 运算符以数值方式比较每个待排序的值,而 cmp 运算符则用来比较字符串,但在上面程序中没有使用。关于 cmp, <=>,$a, $b 和 sort 函数的更多信息可参考:
对于上面的排序,可能还 会遇到另外一种情况,比如有两个同学的分数是相同的,那么我们希望进一步比较它们的名字,也就是分数相同的人的名字按照 ASCII 排列,此时用 or 操作符可以解决这种情况,如:
[code=perl]sub ascending_sort {
$result{$a} <=> $result{$b} or $a cmp $b;
}[/mw_shl_code]
这便是二级排序,当然可能会存在更复杂的情况需要更多级的排序,这时可以用多个 or 来连接 。注意一点,哈希表里面不会存在相同的键,所以上面的表达式不会返回 0 (分数和名字都相同时会返回0)。 |