【问题标题】:How do I map (and sort) values from a hash of hashes?如何从哈希值映射(和排序)值?
【发布时间】:2011-04-04 20:46:29
【问题描述】:

我有一个哈希值,如下所示:

%hash = ( a => { b => 1, c =>2, d => 3}, a1 => { b => 11, c =>12, d => 13}, a2 => { b => 21, c =>22, d => 23} )

我想提取“b”元素并将其放入一个数组中。现在,我正在循环遍历哈希来做到这一点,但我认为我可以通过使用 map 来稍微提高效率。我很确定如果这是一个哈希数组,我会使用这样的东西:

@hasharray = ( { b => 1, c =>2, d => 3}, { b => 11, c =>12, d => 13}, { b => 21, c =>22, d => 23} ) @array = map { ($_->{b} => $_) } @hasharray

如果我错了,请原谅我,我还在学习地图的工作原理。但我想知道的是我将如何映射散列的散列?这甚至可以使用地图吗?我还没有找到任何这样做的例子。

更好的是,此代码中的下一步是在数组填充后对其进行排序。我很确定这是可能的,但我不够聪明地使用地图自己弄清楚。我将如何一口气完成这一切?

谢谢。 赛斯

【问题讨论】:

    标签: perl sorting map hash-of-hashes


    【解决方案1】:

    这会提取并排序所有“b”:

    my @array = sort { $a <=> $b } map $_->{b}, values %hash;
    

    【讨论】:

    • 效果很好,正是我想要的。我用这个替换了 26 行代码,并将该函数的性能从大约 O(n) 提高到 O(1)。谢谢!
    • 好吧,它仍然需要遍历散列值并对其进行排序,所以它实际上不是 O(1)。
    【解决方案2】:

    这用数组引用的排序列表填充@array,每个引用包含b 的值和它来自的hashref。

    my @array = sort {$$a[0] <=> $$b[0]}
                map  { [$$_{b} => $_] } 
                values %hash;
    
    my @sorted_hashes = map {$$_[1]} @array;
    

    【讨论】:

    • $a-&gt;[0]$$a[0] 更容易阅读;同样是$_-&gt;{b} 而不是$$_{b}
    • 对数字进行排序时最好使用&lt;=&gt;运算符而不是cmp
    • @eugene => 好点,正在修复。 @Philip => 出于两个原因,我更喜欢双印记。首先,它适用于其他形式的取消引用,例如@$a[1, 2]。其次,-&gt; 运算符用于方法调用,所以我更喜欢只在调用代码的情况下使用它。
    【解决方案3】:

    采用第二个解决方案,将values %hash 替换为@hasharray

    @array = map { ($_->{b} => $_) } values %hash;
    

    (不要忘记; 来终止语句。)

    【讨论】:

      猜你喜欢
      • 2018-04-14
      • 2010-10-20
      • 2014-05-13
      • 1970-01-01
      • 2013-01-15
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多