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



>我有一个排序的哈希,我正在将其转换为两个单独的数组,一个带有键,一个带有值,如何在转换过程中保持数组像哈希一样排序?我希望能够使用例如 array1[0] 和 array2[0],知道它们是哈希中的键/值对。这就是我转换我的哈希值的方式:

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

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

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

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

#!/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 "@array1n@array2";

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

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

如果要按字母顺序而不是按数字顺序对值进行排序,请使用 cmp 而不是 <=>

我有一个排序的哈希

不,你没有。哈希本质上是未排序的,并且是故意的。你没有展示你做了什么让你认为你已经"排序"了你的哈希值,但我保证这是不可能的。你可以写

sort %hash

但这根本不会有任何用处,当然也不会改变哈希的内容。

唯一可以保证的是,keysvalues 将以相同的顺序返回每个元素的这些部分

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

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

无论如何,你可以这样做。只要您在程序中的同一点使用 keysvalues,并且哈希在两者之间没有被修改,那么$hash{$keys[0]}就可以保证$values[0]

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

最新更新