通过给定元素添加数组中的所有相关元素

时间:2015-10-23 18:32:23

标签: arrays ruby

我出于某种原因在这里撞墙。我需要帮助解决这个问题。我有以下类型的2D数组:

[["Bob", "Car", 25000],
["Bob", "TV", 5000],
["Bob", "dog", 1000],
["Sue", "Cat", 1000],
["Sue", "Car", 10000],
["Bob", "shoes", 100],
["Carol", "car", 20000]]

我需要生成一个数组,该数组是每个子数组中第三个元素的总和。即:

[["Bob", 31100],
["Sue", 11000],
["Carol", 20000]]

现在我有一个复杂而且有人工作的解决方案,它使用两个循环遍历整个数组,用于每个元素。有没有更简单的方式来做到这一点?特别是因为我的数据集会非常大。我知道ruby有很多很棒的枚举,看起来很适合这里,但我不太想到如何适应它们。

4 个答案:

答案 0 :(得分:4)

您可以使用计数哈希:

arr = [["Bob", "Car", 25000],
       ["Bob", "TV", 5000],
       ["Bob", "dog", 1000],
       ["Sue", "Cat", 1000],
       ["Sue", "Car", 10000],
       ["Bob", "shoes", 100],
       ["Carol", "car", 20000]]

arr.each_with_object(Hash.new(0)) { |(name,_,total),h| h[name] += total }
  #=> {"Bob"=>31100, "Sue"=>11000, "Carol"=>20000}

Hash::new用于创建默认值为零的哈希。这意味着如果哈希h没有键nameh[name]将返回零。时间:

h[name] += total

扩展为:

h[name] = h[name] + total
h[name]没有键h时,等式右侧的

name返回零。

答案 1 :(得分:1)

您可以遍历购买数组并将总计存储在哈希值中。

purchases = [
  ["Bob", "Car", 25000],
  ["Bob", "TV", 5000],
  ["Bob", "dog", 1000],
  ["Sue", "Cat", 1000],
  ["Sue", "Car", 10000],
  ["Bob", "shoes", 100],
  ["Carol", "car", 20000]
]

totals = Hash.new(0)  # initialize the values to 0
purchases.each { |purchase|
  totals[purchase[0]] += purchase[2]
}

答案 2 :(得分:1)

arr = [["Bob", "Car", 25000],
["Bob", "TV", 5000],
["Bob", "dog", 1000],
["Sue", "Cat", 1000],
["Sue", "Car", 10000],
["Bob", "shoes", 100],
["Carol", "car", 20000]]

hash_result = Hash.new(0)

arr.each do |record|
  hash_result[record[0]] += record[2]
end

这会给你一个哈希结果。如果您想要一个数组,只需在to_a上调用hash_result

答案 3 :(得分:1)

.group_by(&:first).map do |who, group|
  [who, group.map(&:last).inject(:+)]
end