2011-11-13 44 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 

永远不要这样做,除非你刻意将高尔夫球及/或混淆,虽然它。

相关问题