%HoH => (
abc => {
value => "12",
},
xyz => {
number => "100",
},
pqr => {
digit => "5",
}
)
如何按降序排序值的哈希散列? 輸出
100
12
5
%HoH => (
abc => {
value => "12",
},
xyz => {
number => "100",
},
pqr => {
digit => "5",
}
)
如何按降序排序值的哈希散列? 輸出
100
12
5
我想出了這個解決方案
#!/usr/bin/perl
use strict;
use warnings;
my %HoH = (
abc => {
value => "12",
},
xyz => {
number => "100",
},
pqr => {
digit => "5",
}
);
my %rever;
for my $TopKey(keys %HoH){
for my $value(values %{ $HoH{$TopKey} }){
push @{ $rever{$value} }, $TopKey;
}
}
my @nums = sort {$b <=> $a} (keys(%rever));
print $_, "\n" for @nums;
我逆轉的情況下的值,你仍然需要使用密鑰名稱。
這是使用Dumper後的外觀。
$VAR1 = '100';
$VAR2 = [
'xyz'
];
$VAR3 = '12';
$VAR4 = [
'abc'
];
$VAR5 = '5';
$VAR6 = [
'pqr'
];
您無法對散列進行排序,它不會保留order。如果你想保留它們的排序,你必須根據數字對鍵進行排序並將鍵存儲在數組中。
#!/usr/bin/perl
use strict;
use warnings;
my %HoH = (
abc => { value => 12 },
xyz => { value => 100},
pqr => { value => 5},
def => { value => 15},
hij => { value => 30},
);
my @sorted_keys = map { $_->[0] }
sort { $b->[1] <=> $a->[1] } # use numeric comparison
map { my $temp;
if (exists $HoH{$_}{'value'}) {
$temp = $HoH{$_}{'value'};
} elsif (exists $HoH{$_}{'number'}) {
$temp = $HoH{$_}{'number'};
} elsif (exists $HoH{$_}{'digit'}) {
$temp = $HoH{$_}{'digit'};
} else {
$temp = 0;
}
{[$_, $temp]} }
(keys %HoH);
for my $key (@sorted_keys) {
my $temp;
if (exists $HoH{$key}{'value'}) {
$temp = $HoH{$key}{'value'};
} elsif (exists $HoH{$key}{'number'}) {
$temp = $HoH{$key}{'number'};
} elsif (exists $HoH{$key}{'digit'}) {
$temp = $HoH{$key}{'digit'};
} else {
$temp = 0;
}
print $key . ":" . $temp ."\n";
}
輸出:
xyz:100
hij:30
def:15
abc:12
pqr:5
此技術來進行排序稱爲Schwartzian Transform。
給你實際上並沒有使用任何東西的鑰匙,您可以拼合的數據結構到一個單一的陣列,並在排序:
use strict;
use warnings;
my %HoH = (
abc => {value => "12",},
xyz => {number => "100",},
pqr => {digit => "5",},
);
my @numbers = sort {$b <=> $a} map {values %$_} values %HoH;
print "$_\n" for @numbers;
輸出:
100
12
5
但是,如果你想要使用額外的關鍵信息,那麼你需要將你的哈希哈希值摺疊成一個數組,然後你可以按你喜歡的方式進行排序:
my @array;
while (my ($k, $ref) = each %HoH) {
while (my ($k2, $v) = each %$ref) {
push @array, [$k, $k2, $v];
}
}
@array = sort {$b->[2] <=> $a->[2]} @array;
use Data::Dump;
dd \@array;
個
輸出:
[
["xyz", "number", 100],
["abc", "value", 12],
["pqr", "digit", 5],
]
你總是隻在你內心的哈希一個鍵/值對? – ThisSuitIsBlackNot
不,它可能是多個 – iDev
那麼你怎麼知道要排序的值?相應的鍵是否總是被命名爲「數值」,「數字」或「數字」? – ThisSuitIsBlackNot