有条件地Ruby合并数组

时间:2017-06-13 18:12:51

标签: arrays ruby merge

我在ruby中有一个二维数组,并尝试合并数据如下:

a = [["a","1"],["b","2"],["c","2"],["d","3"],["e","4"],["f","4"],["g","4"]]

我想把它变成

 [["a"],["b c"],["d"],["e f g"]] //merge each letter together if they have the same "key"

有谁可以帮我弄清楚最有效的方法是什么?感谢。

3 个答案:

答案 0 :(得分:3)

执行此操作的一种方法是使用group_by按每个数组中的第二个值对元素进行分组,然后使用map来收集和格式化相关值:

a.group_by(&:last).map { |k,v| [v.map(&:first).join(' ')] }
#=> => [["a"], ["b c"], ["d"], ["e f g"]]

有关详细信息,请参阅Ruby documentation中的group_bymap

答案 1 :(得分:1)

使用Hash可以解决这个问题。

initial_array = [["a","1"],["b","2"],["c","2"],["d","3"],["e","4"],["f","4"],["g","4"]]
constructed_hash = {}
initial_array.each do |item|
  constructed_hash[item[1]] = constructed_hash[item[1]].to_a << item[0]
end
final_array = constructed_hash.values

答案 2 :(得分:1)

虽然它确实构建了一个中介Hash,但它也应该适合你,它只需要一次迭代。

a.each_with_object(Hash.new {|h,k| h[k] =''}) do |(v, k),obj| 
  (obj[k] << " #{v}").strip! 
end.values
#=> ["a", "b c", "d", "e f g"]

或者使用Array(假设“键”是数字和位置,就像它们在问题中一样,否则恢复为选项1)

a.each_with_object([]) do |(v,k), obj|
  ((obj[k.to_i - 1] ||= "") << " #{v}").strip!
end
#=> ["a", "b c", "d", "e f g"]