我出于某种原因在这里撞墙。我需要帮助解决这个问题。我有以下类型的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有很多很棒的枚举,看起来很适合这里,但我不太想到如何适应它们。
答案 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
没有键name
,h[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