最大計算値に関連付けられたキーを見つけるにはどうすればよいですか?

私はその最大値にハッシュと対応するキーで最大値を見つけることを試みています。私のハッシュのように見える

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

今、私はそれが属するキーでそのハッシュの最大値を探したいと思います。

必要な出力は

gita 6.8  

私は%hash で値を昇順にソートしようとしています。このような最大値を得るには

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

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

私は、ハッシュのすべての値がチェックされ、最大値を持つものがそのキーと共に返されるようにしたい。

どうやってやるの?

0
@SinanÜnür私はSonamにあまりにも難しくありません。彼らはそれが実際にハッシュではないことを理解するのに十分よく知っているかもしれません。
追加された 著者 David W.,
少なくともあなたの質問をするために何か努力をするふりをするべきです。これは、キーに関連付けられた複数の値がある%hash ではありません。
追加された 著者 Sinan Ünür,

4 答え

ハッシュには単一のキーと単一の値しかなく、各キーは一意でなければなりません。元の問題では、次のようになります。

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

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

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

%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],
);

Now, we can do a sort on @array depending upon the value of $array[$x]->[1]! All we need is for each element of the array @array is to compare $a->[1] with $b->[1]. Then, if we do a reverse sort on it, the biggest element will be $array[0]. The name is $array[0]->[0] and the element is $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の参考文献を使ったことがない人なら、読んでみることをお勧めします。

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";

もちろん、これは非常に非効率的です(特に 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];
}
1
追加された

あなたはいくつかの良い答えがあります。今や悪い(ハッシュの小数点記号を修正したと仮定して):

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

あなたが故意にゴルフにしようとしているか、それを難読化している場合を除き、決してこれをしないでください。

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,