2011-11-13 45 views
0

我想找出一個散列中的最大值和相應的鍵的最大值。我的哈希看起來像如何找到與最大計算值相關的密鑰?

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

我想在散列所有值最高值選中並且具有最大值的那個應該用它的鍵返回。

我該怎麼做?

+2

你至少應該假裝爲提出你的問題付出一些努力。這不是'%hash',其中有多個值與一個關鍵字相關聯。 –

+2

@SinanÜnür我不會在Sonam太辛苦。他們可能不會很好地理解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]; 
} 
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不能有兩個值。也不能,你可以有兩個密鑰在你的散列等於gita。因此,你不能使用簡單的哈希來存儲你的值。

雖然通過使用引用可以解決這個問題。例如,散列中的每個元素都可以包含一個reference to an array。因此,數據結構可以是這樣的:

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

[的和]馬克到數組的引用。

但是,這並不能真正解決您的特定問題,因爲您現在必須遍歷散列中的每個鍵,然後對數組中的每個鍵進行排序。你可以創建一個排序子程序,但僅僅因爲你可以說sort不會使它有效。可能你需要的是一組數組。這將擺脫你有gita有兩個值的問題,但使排序更容易一些。試想一下,這樣的結構:

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

現在,我們可以做@array排序依據的$array[$x]->[1]價值!我們所需要的是爲數組@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 

永遠不要這樣做,除非你刻意將高爾夫球及/或混淆,雖然它。

相關問題