【问题标题】:Ruby array of arrays to hash with first item as keyRuby 数组数组,以第一项作为键进行散列
【发布时间】:2021-08-20 16:33:26
【问题描述】:

我有一个数组数组(“pluck”用法的结果),格式如下:

arr = [[1, 'A1', 'B1'],[2, 'A2', 'B2'],[3, 'A3', 'B3']]

如何从中获取以下哈希?

{1=>[1, 'A1', 'B1'], 2=>[2, 'A2', 'B2'], 3=>[3, 'A3', 'B3']}

我知道这种形式,但肯定也有一种行形式

hash = Hash.new

arr.each do |x|
  hash[x[0]] = x
end

【问题讨论】:

  • 就我个人而言,我很喜欢你发布的表格——它可能是最易读的并且几乎是最紧凑的,即使其他一些咒语可能会挤出几个字符。我倾向于将其放在 {} 表单中的一行 arr.each { |x| hash[x[0]] = x}
  • @MichaelBerkowski 我倾向于说arr.group_by(&:first) 更紧凑,更易于理解。
  • @engineersmnky 是的,我同意,这是一个巧妙的实现。我承认,如果我在我的代码库中找到它,我将不得不查看 Array#group_by 文档以确保我知道它做了什么。
  • @dawg 不会产生所需的结果,因为它不会在 Hash 的值部分保留元素 sa[0]
  • @dawg 在我的问题中,我提到了 {1=>[1, "A1", "B1"] ...但只是因为它对我来说更容易实现。你的进步非常好。

标签: arrays ruby hash


【解决方案1】:

我能想到的方法很少。

使用group_by(我个人选择这个),reduce和inject方式。

arr = [[1, 'A1', 'B1'],[2, 'A2', 'B2'],[3, 'A3', 'B3']]

arr.reduce({}) { |result, record| result.merge!(record.first => record) }

Or 

arr.inject({}) { |result, record| result.merge!(record.first => record) }

OR

arr.group_by(&:first) # Short and sweet, I think you will pick this up.

【讨论】:

  • 最后一张太棒了!
  • 如果我使用 group_by,哈希内的原始顺序是否保留?
  • arr.group_by(&:first) 没有相当得到相同的结果。这收集了一个元素数组,例如第一个键/值对是1=>[[1, "A1", "B1"]],而不是1=>[1, "A1", "B1"]
  • 您可以在末尾添加.transform_values(&:flatten) 以获得所需的格式。然而,尽管这很“聪明”,但我宁愿选择像this 这样的基本解决方案。
  • 我建议在这种情况下使用reduce或inject,复杂度将是O(n),而group_bytransform_values将是O(2n)。所以节省时间和计算能力和用户reduce
【解决方案2】:

输入

arr = [[1, 'A1', 'B1'],[2, 'A2', 'B2'],[3, 'A3', 'B3']]

代码

p arr.map{|a|[a.first,a]}.to_h

输出

{1=>[1, "A1", "B1"], 2=>[2, "A2", "B2"], 3=>[3, "A3", "B3"]}

【讨论】:

    猜你喜欢
    • 2015-07-01
    • 1970-01-01
    • 2011-05-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多