一种在Ruby中压缩数组数组的好方法

时间:2015-07-28 14:00:02

标签: arrays ruby sorting

数组是:

arr = [["lorem", 10], ["ipsum", 20], ["lorem", 15], ["dolor", 5], ["dolor", 10] ...]

合并它的好方法是什么:

[["lorem", 25], ["ipsum", 20], ["dolor", 15]]
  • 我应该合并相同的字符串值以及它们所拥有的整数(lorem中的arr1015,因此结果是lorem 25 1}})
  • 它们应按整数值排序(上例中为25..20..15)

4 个答案:

答案 0 :(得分:1)

这是一个快速的肮脏方式来解决这个问题

net/http

它将复制数组,因为移位是破坏性的,然后它将按照创建arr = [["lorem", 10], ["ipsum", 20], ["lorem", 15], ["dolor", 5], ["dolor", 10]] arr.dup.group_by(&:shift).map{|k,v|[k,v.flatten.reduce(:+)]}.sort_by{|a|-a.last} #=>[["lorem", 25], ["ipsum", 20], ["dolor", 15]] 的第一个值进行分组:

Hash

然后它将{"lorem"=>[[10],[15]],"ipsum"=>[[20]],"dolor"=>[[5],[10]]} 并在值数组上调用mapflatten

也可以使用reduce

完成
each_with_object

答案 1 :(得分:0)

或许这样的事情:

arr.group_by { |vals| vals[0] }.map { |(k, v)| [k, v.map { |x| x[1] }.reduce(:+)] }.sort_by { |a| -a[1] }

输出

=> [["lorem", 25], ["ipsum", 20], ["dolor", 15]]

答案 2 :(得分:0)

arr.to_enum.with_object(Hash.new(0)){|(k, v), h| h[k] += v}.sort_by(&:last).reverse
# => [["lorem", 25], ["ipsum", 20], ["dolor", 15]]

答案 3 :(得分:0)

arr.group_by(&:first).map { |k, v| [k, v.map(&:last).reduce(&:+)] }