【问题标题】:Sort a nested hash based on one of the values of the of the final hash根据最终散列的值之一对嵌套散列进行排序
【发布时间】:2017-07-30 00:49:18
【问题描述】:

我有一个嵌套散列如下

$hash{$key1}{$key2}{$key3} = value;
my %hash = (
    name1 => {
        a => { line => 4, page => 112 },
        b => { line => 6, page => 134 },
        c => { line => 1, page => 112 }
    },
    name2 => {
        a => { line => 43, page => 112 },
        b => { line => 12, page => 134 },
        c => { line => 55, page => 112 }
    }
)

我想根据line 中的升序值对key2 进行排序。即name1应该有key2排列为cabname2应该有bac的顺序。

我知道散列总是给出随机对,但是有没有办法对值进行系统排列以获得排序的键?

【问题讨论】:

  • 您可以在使用散列时动态排序,以生成您可能需要存储或迭代的列表。你试过sort吗?围绕 SO 有很多帖子展示了如何通过复杂数据结构的不同部分、复杂和/或多个标准等进行更复杂的排序。

标签: perl sorting hash


【解决方案1】:

只有数组可以按特定顺序存储一组值

我想这就是你要找的。对于$key1 的每个值,它将$key2 的排序值存储在一个数组中并打印出来

use strict;
use warnings 'all';

my %hash = (
    name1 => {
        a => { line => 4, page => 112 },
        b => { line => 6, page => 134 },
        c => { line => 1, page => 112 },
    },
    name2 => {
        a => { line => 43, page => 112 },
        b => { line => 12, page => 134 },
        c => { line => 55, page => 112 },
    },
);

for my $key1 ( sort keys %hash ) {
    my $h2 = $hash{$key1};
    my @key2 = sort { $h2->{$a}{line} <=> $h2->{$b}{line} } keys %$h2;
    print "$key1: @key2\n";
}

输出

name1: c a b
name2: b a c

【讨论】:

  • 谢谢。这很有帮助。
【解决方案2】:

不保证散列键以任何特定顺序存储,但您可以创建一个专用索引数组(在您的情况下为数组引用的散列),它将存储按需要排序的键:

my %sorted;
foreach my $key1 (keys %hash) {
    $sorted{$key1} = [ 
        sort { 
            $hash{$key1}{$a}{"line"} 
            <=> 
            $hash{$key1}{$b}{"line"} 
        } keys $hash{$key1} 
    ];
}

那么你可以这样使用@{$sorted{$key1}}索引数组,例如:

foreach my $key1 (keys %hash) {
    foreach my $key2 (@{$sorted{$key1}}) {
        print "$key1.$key2: "
            ."line: $hash{$key1}{$key2}{'line'}, "
            ."page: $hash{$key1}{$key2}{'page'}\n";
    }
}

输出:

name2.b: line: 12, page: 134
name2.a: line: 43, page: 112
name2.c: line: 55, page: 112
name1.c: line: 1, page: 112
name1.a: line: 4, page: 112
name1.b: line: 6, page: 134

【讨论】:

  • 感谢先生的帮助。
猜你喜欢
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
  • 2014-05-07
  • 2014-01-08
  • 2014-11-07
  • 2010-11-02
  • 2013-03-14
相关资源
最近更新 更多