2011-11-13 14 views
0

ハッシュの最大値とその最大値に対応するキーを調べようとしています。私のハッシュは次のようになります計算された最大値に関連付けられたキーを見つける方法を教えてください。

%hash = (
    bob => "4.9", 
    gita => "3.9 , 6.8", 
    diu => "3.0", 
); 

ここで、そのハッシュの最大値を、それが属するキーで探したいとします。必要

出力は

gita 6.8 

である私は、この

sub hashValueAscendingNum { 
    $hash{$a} cmp $hash{$b}; 
} 

foreach my $highest (sort hashValueAscendingNum(keys(%hash))) { 
    print "\t $hash{$highestMagnitude} \t\t $highest \n"; 
} 

のような最大値を取得するために、昇順に%hashで値をソートしようとしている私は、ハッシュ内のすべての値になりたいですチェックされ、最大値を持つものがそのキーとともに返されるべきである。

どうすればいいですか?

+2

あなたは、少なくともあなたの質問にポーズをとるようなふりをするべきです。これは、キーに関連する複数の値が存在する '%ハッシュ 'ではありません。 –

+2

@SinanÜnür私はSonamにあまりにも難しくありません。彼らはそれが実際にハッシュではないことを理解するのに十分よく知っているかもしれません。 –

答えて

1

最初に各キーを元の%hashにある対応する値の最高値に関連付ける必要があります。次に、最も高い値に関連付けられたキーを見つけます。もちろん

#!/usr/bin/env perl 

use strict; use warnings; 

use List::Util qw(max); 

my %hash = (
    bob => [ 4.9 ], 
    gita => [ 3.9, 6.8 ], 
    diu => [ 3.0 ], 
); 

my %max = map { $_ => max @{ $hash{$_} } } keys %hash; 

my ($argmax) = (sort { $max{$b} <=> $max{$a} } keys %max)[0]; 
my $max = $max{ $argmax }; 

print join(' => ', $argmax, $max), "\n"; 

、これは(ESP。sortを使用して)非常に非効率的ですが、あなたが示した寸法のために、それは問題ではありません。完全を期すため、ここではeachを使用して、より効率的なバージョンは次のとおりです。

#!/usr/bin/env perl 

use strict; use warnings; 

use List::Util qw(max); 

my %hash = (
    bob => [ 4.9 ], 
    gita => [ 3.9, 6.8 ], 
    diu => [ 3.0 ], 
); 

my ($argmax, $max) = @{ init_argmax_max(\%hash) }; 

while (my ($k, $v) = each %hash) { 
    $v = max @{ $v }; 
    if ($v > $max) { 
     $argmax = $k; 
     $max = $v; 
    } 
} 

print join(' => ', $argmax, $max), "\n"; 

sub init_argmax_max { 
    my ($hash) = @_; 
    my ($argmax, $max) = each %{ $hash }; 

    keys %{ $hash }; 

    $max = max @{ $max }; 

    return [$argmax, $max]; 
} 
0
#!/usr/bin/perl 
use warnings; 
use strict; 

my %hash = (
    bob => [ 4.9 ], 
    gita => [ 3.9, 6.8 ], 
    diu => [ 3.0 ], 
); 

my $max_key; 
my $max_val=0; 

foreach my $key (keys %hash) { 
    foreach my $val (@{$hash{$key}}) { 
     ($max_key, $max_val) = ($key, $val) 
      if $val > $max_val; 
    } 
} 

print "$max_key => $max_val\n"; 
+0

本当にありがとう、ありがとう。 – ssharma

1

ハッシュは、単一のキーと単一の値を持ち、各キーは一意である必要があります。あなたはこれを持って、あなたの元の問題では:

まあ
%hash = (
    bob => "4.9", 
    gita =>"3.9 , 6,8", 
    diu => "3.0", 
); 

gitaは、2つの値を持つことができません。また、ハッシュの2つのキーをgitaにすることはできません。したがって、単純なハッシュを使用して値を格納することはできません。

これを回避するには、参照を使用する方法があります。たとえば、ハッシュの各要素にはreference to an arrayを含めることができます。したがって、あなたのデータ構造は次のようになります。

%hash = (
    bob => [(4.9)], 
    gita => [(3.9, 6.8)], 
    diu => [(3.0)], 
); 

[]は配列への参照をマーク。

しかし、ハッシュの各キー、各キーの配列の各要素を順番に調べて並べ替える必要があるので、これは実際にはあなたの特定の問題を解決しません。ソートサブルーチンを作成することもできますが、sortと言っても効率的ではないと言えるからです。

多分配列の配列が必要です。これにより、2つの値を持つgitaの問題を取り除くことができますが、並べ替えが簡単になります。このような構造を想像:今すぐ

my @array = (
    [bob => 4.9], 
    [gita => 3.9], 
    [gita => 6.8], 
    [diu => 3.0], 
); 

、我々は$array[$x]->[1]の値に応じ@arrayに並べ替えを行うことができます!配列@arrayの各要素に対して必要なのは、$ a - > [1]と$ b - > [1]を比較することだけです。逆ソートを行うと、最大の要素は$array[0]になります。名前は$array[0]->[0]で、要素は$array->[0]->[1]です。

#! /usr/bin/env perl 
use strict; 
use warnings; 
use feature qw(say switch); 

my @array = (
    [bob => 4.9], 
    [gita => 3.9], 
    [gita => 6.8], 
    [diu => 3.0], 
); 

@array = reverse sort mysort @array; 

say "$array[0]->[0] $array[0]->[1]"; 

sub mysort { 
    $a->[1] <=> $b->[1]; 
} 

、出力は次のとおりです。

gita 6.8. 

あなたはPerldoc's perllolへリンクしているに気づきますか?以前はPerlの参考文献を使ったことがない人なら、読んでみることをお勧めします。

0

あなたはいくつかの良い答えがあります。今、悪いもの(あなたがハッシュで小数点区切りを修正すると仮定した場合):

my %hash = (bob => "4.9", 
      gita =>"3.9 , 6.8", 
      diu => "3.0", 
      ); 

my $max = (map{join" ",@$_[0,1]}sort{$b->[1]-$a->[1]}map{[$_,sort{$b-$a}split(/ , /,$hash{$_})]}keys%hash)[0]; 

print "$max\n"; 

出力:あなたが意図的にゴルフにしようとしておよび/またはかかわらず、それを難読化している場合を除き

gita 6.8 

これを行うことはありません。

関連する問題