我在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"
有谁可以帮我弄清楚最有效的方法是什么?感谢。
答案 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_by
和map
。
答案 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"]