my %Hash = (
1111 => [5,6] ,
5555 => [3,4],
2222 => [3],
4444 => [3,1]
)
如何按值对哈希进行升序排序,以便所有值都应显示为排序,但如果元素相等,则键的排序应为降序。
< p> <p> Output:
1111 => 6
5,
5555 => 4
3 ,
4444 => 3
1 ,
2222 => 3
</p>
答案 0 :(得分:3)
我不知道您对降序的含义。你能举个例子吗?我将按照您显示的输出进行操作。
我假设您不想更改原始数据(情况可能并非如此),所以我使用map-sort创建了一个中间数据。我按顺序查看该中间结果,并进行一些巧妙的操作以得到所需的结果。许多丑陋之处在于让您获得所需的格式。
postfix dereference在这里很有用:
use v5.26;
use utf8;
use strict;
use warnings;
my %Hash = (
1111 => [5,6],
5555 => [3,4],
2222 => [3],
4444 => [3,1]
);
foreach my $tuple (
sort {
$b->[1][0] <=> $a->[1][0]
}
map {
[ $_, [ sort { $b <=> $a } $Hash{$_}->@* ] ];
}
keys %Hash
) {
print my $string = "$tuple->[0] => ";
my $indent = length $string;
foreach my $i ( 0 .. $tuple->[1]->$#* ) {
print ' ' x $indent if $i;
print $tuple->[1][$i];
print ',' if $i == $tuple->[1]->$#*;
print "\n";
}
}
这将产生:
1111 => 6
5,
5555 => 4
3,
4444 => 3
1,
2222 => 3,