【问题标题】:In Perl, how can I print the key corresponding to the maximum value in a hash?在 Perl 中,如何打印对应于哈希中最大值的键?
【发布时间】:2011-12-31 04:14:53
【问题描述】:

如何仅打印哈希的第一个键和元素?

我已经有一个排序的哈希,但我只想打印第一个键和相应的值 谢谢,

最后感谢大家,我将键和值推送到两个不同的@array 并打印每个数组的元素 0,它可以工作:)

【问题讨论】:

  • 你的第一把钥匙是什么?
  • 如果您想要一个保留添加键顺序的哈希,您可能会发现 Tie::IxHash 很有用。

标签: perl hash


【解决方案1】:

哈希具有无序键。因此,哈希中没有 first key 这样的键。

但是,如果您需要首先排序的键(以获得最大键值):

my %hash = (
    'foo' => 'bar',
    'qux' => 'baz',
);

my ($key) = sort { $b cmp $a } keys %hash;
print "$key => $hash{$key}";  # Outputs: qux => baz

记住使用<=> 而不是cmp 进行数字排序。

【讨论】:

  • 但是如果我对哈希进行了排序并且我只需要打印第一个键和值是不可能的?
【解决方案2】:

在 perl 哈希中,键没有排序。使用sort 函数按您想要的顺序获取键,或者您可以在创建哈希时将键推入数组中,并且您的第一个键将在数组中的第零个索引中

您可以使用下面的代码,我假设哈希名称是 my_hash,键和值是数字。如果你有字符串,你可以使用cmp 而不是<=>。有关详细信息,请参阅排序文档

获取最大密钥

foreach (sort {$b <=> $a} keys %my_hash) {
    print "Keys is $_\n";
    print "Value is $my_hash{$_}\n";
    last;
}

获取最大值对应的key

foreach (sort {$my_hash{$b} <=> $my_hash{$a}} keys %my_hash) {
    print "Keys is $_\n";
    print "Value is $my_hash{$_}\n";
    last;
}

【讨论】:

    【解决方案3】:

    正如 Alan 所写 - 哈希没有特定的顺序,但您可以对哈希键进行排序:

    foreach my $key (sort keys(%hash)) {
       print $key . ': ' . $hash{$key} . "\n";
    }
    

    或者,如你所愿,从键数组中获取第一个元素:

    my @keys = keys(%hash);
    print $keys[0];
    

    【讨论】:

    • 是的,我已经排序,但我只想打印最大值
    • @user1051414 啊,所以你需要最大值。这仍然不清楚,您是否想要特定键的最大键或最大值或最大值(如果值是数组)。使用此信息更新您的问题
    • 是的,打印我的密钥,但我想要密钥和值,对不起
    • @user1051414 如果键是 $_ 那么值就是 $my_hash{$_}
    • 最后感谢大家,我将键和值推送到两个不同的@array 并打印每个数组的元素 0,它可以工作:)
    【解决方案4】:
    foreach my $key (sort keys(%hash)) { 
       print "$key" .  "$hash{$key}" . "\n"; 
       last;
    } 
    

    【讨论】:

      【解决方案5】:

      对于大散列,如果您出于任何其他原因不需要排序的键,最好避免排序。

      #!/usr/bin/env perl
      
      use strict; use warnings;
      
      my %hash = map { $_ => rand(10_000) } 'aa' .. 'zz';
      
      my ($argmax, $max) = each %hash;
      keys %hash; # reset iterator
      
      while (my ($k, $v) = each %hash) {
          if ($v >= $max) {
              $max = $v;
              $argmax = $k;
          }
      }
      
      print "$argmax => $max\n";
      

      如果你打算排序,你只需要最大值的键,而不是keysvalues的整个数组:

      #!/usr/bin/env perl
      
      use strict; use warnings;
      
      my %hash = map { $_ => rand(10_000) } 'aa' .. 'zz';
      my ($argmax) = sort { $hash{$b} <=> $hash{$a} } keys %hash;
      
      print "$argmax => $hash{$argmax}\n";
      

      【讨论】:

        猜你喜欢
        • 2018-07-04
        • 1970-01-01
        • 1970-01-01
        • 2017-09-30
        • 2011-10-27
        • 2016-12-18
        • 2012-10-23
        • 2012-08-10
        • 1970-01-01
        相关资源
        最近更新 更多