2012-01-09 25 views
0

どのように私はハッシュを使用してPerlのVALUEに基づいてキーを取得するのですか? 私が持っている場合: Perlでハッシュを使った値に基づいてキーを取得する方法は?

"dime"=>"4" 
"nickle"=>"5" 
"quarter"=>"2" 
"dollar"=>"6" 

は今、私はそれらをソートし、最高は6 Iのwannaは「ドル」をつかむことができるようです。ここに私が試したものです:

# sort money based on count 
my @sorted = sort {$deposit->{$b} cmp $deposit->{$a}} keys %$deposit; 
    my %rhash; 
    @rhash{values %deposit} = keys %deposit; 

    $owner = $rhash->{$sorted[0]}; #get highest count 
+0

は一意の値ですか? – Alnitak

+1

リアルコードをコピー/貼り付けする必要があります。投稿コードにハッシュリファレンス($ deposit)とハッシュ(%deposit)の両方があります。それはあなたが本当に持っているものか、存在しないコードを修正することですか? ($ rhash /%rhash ...と同じです) – tadmc

+0

@Alnitak、はい値は一意です – infinitloop

答えて

3

あなたの値が一意である場合、あなたはこのようにマップを逆にすることができます:

my %rev = map { $deposit->{$_} => $_ } keys %$deposit; 

+0

優れたソリューション。 +1 – dimir

+4

または単に 'my%rev = reverse%$ deposit;'です。 – Sean

+0

@Seanはその逆の新機能ですか?私はperlを学んだとき、そこにいることを思い出しません。 – Alnitak

2

並べ替え[$depositが記載されているハッシュへの参照であると仮定] O(n log n)であり、これは必要以上の仕事である。最高を見つけることは、O(n)アルゴリズムを用いて行うことができる。ここに「最高水準点」アルゴリズムを使用した例があります。

#!/usr/bin/perl 
use warnings; 
use strict; 

my %deposit = (
    "dime"=>"4", 
    "nickle"=>"5", 
    "quarter"=>"2", 
    "dollar"=>"6", 
); 

my $hi_key; 
foreach (keys %deposit) { 
    $hi_key = $_ if $deposit{$_} > $deposit{$hi_key}; 
} 

print "high is: $hi_key => $deposit{$hi_key}\n"; 
+1

実際に私はソートビットは無関係だと思います - それはOPが後にある 'key - > value'を' value - > key'に変換しています。 – Alnitak

関連する問題