转换为两个数组后保持哈希排序

时间:2016-02-09 14:50:37

标签: arrays perl sorting hash

我有一个已排序的哈希,我将转换为两个独立的数组,一个包含键,一个值,如何通过转换过程保持数组像哈希一样排序?我希望能够使用例如array1 [0]和array2 [0]知道它们是散列中的键/值对。这是我转换哈希的方式:

my @array1 = keys %hash;
my @array2 = values %hash;

现在是array1&的元素array2不会以打印排序的键/值的相同顺序显示信息。有没有办法按照与值哈希相同的方式对数组进行排序?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望两个数组都按哈希值排序。

按值对第二个数组的索引进行排序,然后使用结果索引列表对第一个数组进行切片:

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

my %hash = ( eight => 8,
             five  => 5,
             four  => 4,
             nine  => 9,
             one   => 1,
             seven => 7,
             six   => 6,
             ten   => 10,
             three => 3,
             two   => 2,
           );

my @array1 = keys %hash;
my @array2 = values %hash;

my @indices = sort { $array2[$a] <=> $array2[$b] } 0 .. $#array2;
@array1 = @array1[@indices];
@array2 = @array2[@indices];

say "@array1\n@array2";

或者,按值对键进行排序,然后将哈希映射到键以获取值:

my @array1 = sort { $hash{$a} <=> $hash{$b} } keys %hash;
my @array2 = map $hash{$_}, @array1;

如果您想按字母顺序而不是按字母顺序对值进行排序,请使用cmp代替<=>

答案 1 :(得分:1)

  

我有一个排序哈希

不,你不是。哈希本质上是未分类的,故意如此。你没有表现出你所做的事情,这让你认为自己已经完成了排序&#34;你的哈希,但我保证这是不可能的。你可以写

sort %hash

但这根本不会有用,肯定不会改变哈希的内容

所有保证的是keysvalues将以相同的顺序返回每个元素的那些部分

如果你解释了你的目标,那么我们将能够提供更好的帮助

  

我希望能够使用例如array1 [0]和array2 [0]知道它们是散列中的键/值对

无论如何你都可以这样做。只要您在程序中的同一点使用keysvalues,并且哈希值不会在其间进行修改,那么$hash{$keys[0]}将保证为{{1} }}

如果您需要按特定顺序检索哈希的内容,那么您必须描述您的目的并更好地说出您需要的内容