您可以使用默认值为 0 的 Hash 进行计数,然后最后您可以将其转换为 Array 以产生您想要的格式,但我认为您可能只想继续使用 Hash。
data = [
["fish","2"],
["fish","40"],
["meat","56"],
["meat","1"]
]
hist = data.each_with_object(Hash.new(0)) do |(k,v), h|
h[k] += v.to_i
end
hist # => {"fish"=>42, "meat"=>57}
hist.to_a # => [["fish", 42], ["meat", 57]]
# To get String values, "42" instead of 42, etc:
hist.map { |k,v| [k, v.to_s] } # => [["fish", "42"], ["meat", "57"]]
既然你说你必须从文件中读取数据,这里是应用到文件时的上述内容。本input.txt
例的文件内容如下:
fish,2
fish,40
meat,56
meat,1
然后,通过逐行读取来创建与以前相同的输出:
file = File.open('input.txt')
hist = file.each_with_object(Hash.new(0)) do |line, h|
key, value = line.split(',')
h[key] += value.to_i
end
file.close