【问题标题】:How can I sort the values of a hash in decreasing order in perl?如何在 perl 中按降序对哈希值进行排序?
【发布时间】:2014-06-29 05:45:56
【问题描述】:

我正在尝试使用此代码,但它尝试对键进行排序,因为它们不是数字,所以它不能这样做。

foreach my $word (sort {$b <=> $a} keys %wordHash) {
        printf ("%-20s %10d\n", $word, $wordHash{$word});
}

【问题讨论】:

  • 如果您需要值,请使用values 而不是keys。如果要按字母顺序排列,请使用cmp 而不是&lt;=&gt;
  • @ooga - 有点不清楚 OP 想要什么......我回答了我能想到的所有 3 个选项
  • 术语的关键点:您不能对哈希进行排序。哈希没有顺序。您可以做的是以给定顺序打印散列中的内容,但散列本身未排序。这与 PHP 数组不同,PHP 数组具有像 Perl 哈希一样的键查找,但也像 Perl 数组一样按特定顺序。
  • @AndyLester - 好吧,如果你很狡猾,你可以对哈希进行排序(例如通过捆绑哈希),但这有点令人厌恶,只能作为最后的手段。
  • 我认为这与我们在这里讨论的内容无关。 OP 不想要“排序的哈希”,他希望哈希输出的内容按排序顺序。

标签: perl sorting hash


【解决方案1】:
  • 如果您想按值顺序打印哈希,那么您只需比较 sort 块中的值,而不是比较键本身:

     { $wordHash{$b} <=> $wordHash{$a} } 
     # The rest of your code stands
    

    这是因为sort 中使用的块可以是任何具有任意逻辑的匿名子程序;只要它返回正/0/负值。

  • 如果你只想要排序值而不考虑键,那就更简单了(似乎有点没有意义,所以我假设你想要前一个选项,但以防万一我也会回答这个问题): p>

     sort {$b <=> $a} values %wordHash
    
  • 另外,如果您想按按键顺序打印,但按字母顺序而不是数字排序,默认排序 sorts lexically(与 { $a cmp $b } 相同):

     sort keys %wordHash               # sort in ascending alphanumeric
     reverse sort keys %wordHash       # sort in descending alphanumeric
     sort { $b cmp $a } keys %wordHash # same: descending alphanumeric,
                                       #   faster on large data but less readable
    

【讨论】:

  • 我怀疑他在找cmp
  • 是的,但默认也是升序排序,他想要降序。你需要明确地做,{ $b cmp $a }
  • @TLP - 很公平。我扩展了该细节以涵盖所有选项。
猜你喜欢
  • 1970-01-01
  • 2012-10-24
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多