Perl 按值和键对哈希进行排序(按该顺序)
我正在寻找一种很好的方法,在Perl中先按值排序,然后按键排序 例如:Perl 按值和键对哈希进行排序(按该顺序),perl,sorting,hash,Perl,Sorting,Hash,我正在寻找一种很好的方法,在Perl中先按值排序,然后按键排序 例如: my %userids = ( williams => "Marketing", smith => "Research", johnson => "Research", jones => "Marketing", brown => "Marketing", davis => "Research" ); 输出: Marketing: br
my %userids = (
williams => "Marketing",
smith => "Research",
johnson => "Research",
jones => "Marketing",
brown => "Marketing",
davis => "Research"
);
输出:
Marketing: brown
Marketing: jones
Marketing: williams
Research: davis
Research: johnson
Research: smith
brown: Marketing
jones: Marketing
williams: Marketing
Johnson: Research # here it shifted to fourth record
davis: Research
smith: Research
请注意,值是第一个排序级别。第二级排序是关键。你知道如何以优雅和高性能的方式实现这一点吗?谢谢 好的参考:
我想补充一点,在排序中使用
\L sequence
FromPerlfaq4:如何对哈希进行排序(可选按值而不是按键)
为了使报表顺序不区分大小写,我们在双引号字符串中使用\L序列
,使所有内容都小写。然后,sort()
块比较小写值以确定键的放置顺序
foreach (sort { $userids{$a} cmp $userids{$b} or "\L$a" cmp "\L$b" ) {
print "$_: $userids{$_}\n";
}
输出:
brown: Marketing
jones: Marketing
williams: Marketing
davis: Research
Johnson: Research # here 'J'ohnson, J is in uppercase(taking assumption), come as fifth record
smith: Research
二,
输出:
Marketing: brown
Marketing: jones
Marketing: williams
Research: davis
Research: johnson
Research: smith
brown: Marketing
jones: Marketing
williams: Marketing
Johnson: Research # here it shifted to fourth record
davis: Research
smith: Research
我想说,从语义上讲,只有在将元素输入到散列中时才有意义。否则,当哈希同时包含Johnson和Johnson时,您将得到无法解释的结果。也就是说,在排序时,你很难说“键是等价的”——根据传统定义,哈希表不能包含两个等价键是的,真正的键在哈希中总是唯一的,从不包含两个等价键,但你可以看到输出中的差异。我可以看到输出中的差异。这就是为什么我认为这会是一件奇怪的事情:它违反了在我的视图中很少会发生的规则,但我认为添加它会很好:)