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
展开
 我来答
百度网友c9e795dda
2014-09-04 · TA获得超过5167个赞
知道大有可为答主
回答量:1128
采纳率:0%
帮助的人:1150万
展开全部

首先你要明白 :

  1. hash 是无序的 ( 除非你用 Tie::IxHash ), 所以你基本上不能排出一个顺序的 hash, 你只能靠一条 array, 去找出 --- "如果排序了, 那 keys 的顺序会是怎样的"

  2. 在 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
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式