【问题标题】:How to store values of hash in array in perl?如何在perl中将哈希值存储在数组中?
【发布时间】:2016-06-16 18:36:45
【问题描述】:

我有一个具有重复值和唯一键的散列。我必须将键存储在大小为 5 的数组中,如果有更多键,则应创建新数组并将其存储在其中。 存储在 1 个数组中的键应该具有相同的值。

注意:我必须从 excel 表中读取这些值并生成 c 源文件。

例如: %hash = (a=>1,b=>2,c=>1,d=>1,e=>3,f=>4,g=>4,h=>1,i=>1,j =>1);

c 文件中的输出:

datatype arr1[]={a,c,d,h,i};
datatype arr2[]={j};
datatype arr3[]={b};
datatype arr4[]={e};
datatype arr5[]={f,g};

【问题讨论】:

  • Re "我的哈希有重复的键",这是不可能的。这就像有人说他们有一个包含重复索引的数组。
  • 这就是为什么我做了反向具有重复值和唯一键。这些值我必须从 excel 表中读取。
  • 请通过编辑而不是添加评论来解决问题。
  • 几行示例数据和预期结果可能会让您更清楚您想要什么......

标签: perl hash


【解决方案1】:

所以你需要找到具有相同值的键?

所以我们需要对数组进行某种还原,但要巧妙地处理原始值不唯一的问题。我们需要将键存储在数组中,而不是仅仅将 'key' => 'value' 对转换为 'value' => 'key'。

my %hash = ...;

my %transposed;
for my $key (keys %hash) {
    my $value = $hash{$key};

    $transposed{$value} = [] unless defined $transposed{$value};
    push @{ $transposed{$value} }, $key;
}

然后你有一个数组的散列,其中每个键是原始散列中的一个值,数组的元素是键。下一步是遍历键并将每个列表拆分为 5 个元素的行:

for my $key (sort keys %transposed) {
    while (@{ $transposed{$key} }) {
        my @list = splice @{ $transposed{$key} }, 0, 5;
        say join ", ", @list;
    }
}

主要部分是 while 循环迭代,只要当前列表中有元素,并且拼接每次迭代都会从列表中删除并返回最多 5 个元素。添加确切的 C 代码作为练习留给感兴趣的读者... :-)

您可能需要阅读参考资料:http://perldoc.perl.org/perlreftut.html

设置一个哈希值到一个空数组的引用是不必要的,因为当你尝试向它推送一个值时,perl 会自动创建一个 arrayref。我将其包含在内是为了更清楚地说明发生了什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-18
    • 2010-09-20
    • 2010-12-08
    • 1970-01-01
    • 2010-09-16
    • 2021-08-20
    • 2010-12-20
    • 2012-02-01
    相关资源
    最近更新 更多