【问题标题】:Sorting by value Hash of Hashes Perl按值哈希排序 Perl
【发布时间】:2013-02-18 19:04:04
【问题描述】:

假设我有一个哈希数据结构的哈希构造如下:

%HoH => (
     flintstones => {
               family_members    => "fred;wilma;pebbles;dino",
               number_of_members => 4,
     },
     jetsons => {
               family_members    => "george;jane;elroy",
               number_of_members => 3,
     },
     simpsons => {
               family_members    => "homer;marge;bart;lisa;maggie",
               number_of_members => 5,
     },

)

如何按值number_of_members 从大到小对键(在这种情况下为家庭)进行排序?然后我想打印出最高的两个。这是一个大致的想法,但我知道这是错误的:

foreach $value (
    sort {
    $HoH{$a}{$number_of_members} cmp $HoH{$b}{$number_of_members}
    } keys %HoH)
my $count = 0;
while ($key, $value) = each %HoH) {
    if (count <= 2){
        print "${HoH}{$key}\t$key{$value}";
    }
}
continue {
    $count++;
};

我想要打印代码(空格是制表符分隔的):

simpsons    homer;marge;bart;lisa;maggie
flintstones    fred;wilma;pebbles;dino

【问题讨论】:

  • 将 cmp 替换为 。你在做一个数值比较

标签: perl sorting hash-of-hashes


【解决方案1】:

你在正确的轨道上。您在散列中使用 $a$b 内部变量并以数字方式比较值(&lt;=&gt; 而不是 cmp)。

打印时,我发现将键存储在数组中并使用数组切片来访问它们是最简单的方法。

use strict;
use warnings;

my %HoH = (
     flintstones => {
               family_members    => "fred;wilma;pebbles;dino",
               number_of_members => 4,
     },
     jetsons => {
               family_members    => "george;jane;elroy",
               number_of_members => 3,
     },
     simpsons => {
               family_members    => "homer;marge;bart;lisa;maggie",
               number_of_members => 5,
     },    
);
my @sorted = sort { $HoH{$b}{'number_of_members'} <=> 
                    $HoH{$a}{'number_of_members'} } keys %HoH;

for (@sorted[0,1]) {   # print only first two
    print join("\t", $_, $HoH{$_}{'family_members'}), "\n";
}

输出:

simpsons        homer;marge;bart;lisa;maggie
flintstones     fred;wilma;pebbles;dino

【讨论】:

  • 谢谢。我必须多看一点才能理解所有内容,但我理解它的要点。
  • @cooldood3490 不客气。有什么不清楚的地方欢迎追问。
猜你喜欢
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 2018-07-21
  • 2011-06-08
  • 2014-10-27
相关资源
最近更新 更多