perl哈希使用时,如果出现多个值相同,如何处理?
比如1:0.12:0.23:0.24:0.45:0.66:0如何用哈希排序成5:0.64:0.42:0.23:0.21:0.16:0...
比如
1:0.1
2:0.2
3:0.2
4:0.4
5:0.6
6:0
如何用哈希排序成
5:0.6
4:0.4
2:0.2
3:0.2
1:0.1
6:0 展开
1:0.1
2:0.2
3:0.2
4:0.4
5:0.6
6:0
如何用哈希排序成
5:0.6
4:0.4
2:0.2
3:0.2
1:0.1
6:0 展开
1个回答
展开全部
首先你要明白 :
hash 是无序的 ( 除非你用 Tie::IxHash ), 所以你基本上不能排出一个顺序的 hash, 你只能靠一条 array, 去找出 --- "如果排序了, 那 keys 的顺序会是怎样的"
在 hash 中, key 永远是绝对独一的, 所以, 在你现在的条件下, 即使上面我提到有 IxHash 可以做到有序的 hash, 来到这里也不适用了
这里写了一个 sub 给你参巧 :
sub rebuildHash {
my %argv = @_;
my ( %rebuild , @return );
while ( my ( $k, $v ) = each %argv ) {
if (defined $rebuild{$v} ) {
if ( not ref $rebuild{$v} ) {
my $prevKey = $rebuild{$v} ;
$rebuild{$v} = [ $prevKey, $k ];
}
else { # $rebuild is not an array ref
push @{$rebuild{$v}}, $k
}
}
else { # if this key is not even existed
$rebuild{$v} = $k
}
}
foreach my $k ( sort {$a<=>$b} keys %rebuild ) { # use { $a cmp $b } for string sort
if ( ref $rebuild{$k} ) {
push @return, @{$rebuild{$k}};
}
else {
push @return, $rebuild{$k};
}
}
return @return
}
#main
my %h = ( One => 1, Two => 2, AnotherOne => 1, Three => 3 ) ;
my @sorted = rebuildHash %h ;
foreach my $sd ( @sorted ) {
print "$sd => $h{$sd} $/"
}
__END__
AnotherOne => 1
One => 1
Two => 2
Three => 3
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询