在数组中组合类似哈希的算法

时间:2013-06-14 20:37:13

标签: ruby arrays hash

问题主要在标题中:

给出一个数组

array = [{x: 1, y: "jacksonville"}, 
        {x: 2, y: "atlanta"}, 
        {x: 1, y: "tampa"}, 
        {x: 2, y: "atlanta"},
        {x: 2, y: "jacksonville"},
        {x: 2, y: "miami"}, ]

获得以下结果的好方法

array = [{x: 3, y: "jacksonville",
         {x: 4, y: "atlanta"},
         {x: 1, y: "tampa"},
         {x: 2 ,y: "miami"}]

输入是我正在使用的简单版本,但正如你可以看到我试图删除y值的重复但保留x值,我知道我可以在每个哈希组合上运行合并通过将黑色传递给Hash#merge两次哈希,但我很难将所有哈希值相互比较或找到重复项。寻找高性能的解决方案。

2 个答案:

答案 0 :(得分:3)

下面:

array.group_by{|e|e[:y]}.map{|k,v|{x:v.reduce(0){|a,b|a+b[:x]},y:k}}

答案 1 :(得分:0)

首先,您必须创建一种方便的方法来索引y数据。我会使用Hash:

h = array.inject({}) do |ret, item|
   ret[item[:y]] ||= 0 # initialize each item
   ret[item[:y]] += item[:x] # increment count
   ret # return the hash
end

有了这个Hash,你可以生成新的数组:

h.map {|key, value| {x: value, y: key}}