在Ruby中合并和交错两个数组

时间:2011-09-05 21:02:34

标签: ruby arrays

我有以下代码:

a = ["Cat", "Dog", "Mouse"]
s = ["and", "&"]

我想将数组s合并到数组a中,这会给我:

["Cat", "and", "Dog", "&", "Mouse"]

浏览Ruby Array和Enumerable docs,我没有看到这样的方法。

有没有办法可以在不迭代每个数组的情况下做到这一点?

12 个答案:

答案 0 :(得分:167)

你可以这样做:

a.zip(s).flatten.compact

答案 1 :(得分:32)

这不会按照Chris要求的顺序给出结果数组,但是如果结果数组的顺序无关紧要,则可以使用a |= b。如果您不想改变a,可以编写a | b并将结果分配给变量。

请参阅http://www.ruby-doc.org/core/classes/Array.html#M000275处的Array类的set union文档。

此答案假定您不需要重复的数组元素。如果要在最终数组中允许重复元素,a += b应该可以解决问题。同样,如果您不想改变a,请使用a + b并将结果分配给变量。

为了回应本页面上的一些评论,这两个解决方案将适用于任何规模的数组。

答案 2 :(得分:28)

如果您不想复制,为什么不使用union运算符:

new_array = a | s

答案 3 :(得分:6)

s.inject(a, :<<)

s   #=> ["and", "&"]
a   #=> ["Cat", "Dog", "Mouse", "and", "&"]

它没有给你你要求的顺序,但是通过附加到一个数组合并两个数组是一种很好的方法。

答案 4 :(得分:6)

这是一个允许交错不同大小的多个阵列的解决方案(通用解决方案):

arr = [["Cat", "Dog", "Mouse", "boo", "zoo"],
 ["and", "&"],
 ["hello", "there", "you"]]

first, *rest = *arr; first.zip(*rest).flatten.compact
=> ["Cat", "and", "hello", "Dog", "&", "there", "Mouse", "you", "boo", "zoo"]

答案 5 :(得分:5)

它不是很优雅,但适用于任何大小的数组:

>> a.map.with_index { |x, i| [x, i == a.size - 2 ? s.last : s.first] }.flatten[0..-2] 
#=> ["Cat", "and", "Dog", "&", "Mouse"]

答案 6 :(得分:3)

即使第一个数组不是最长且接受任意数量的数组,一个更通用的解决方案怎么样?

a = [
    ["and", "&"],
    ["Cat", "Dog", "Mouse"]
]

b = a.max_by(&:length)
a -= [b]
b.zip(*a).flatten.compact

 => ["Cat", "and", "Dog", "&", "Mouse"]

答案 7 :(得分:1)

进行交错并且保证哪一个是zip方法的最大数组的一种方法是用nil填充其中一个数组,直到另一个数组大小。这样,您还可以保证哪个数组的哪个元素位于第一个位置:

preferred_arr = ["Cat", "Dog", "Mouse"]
other_arr = ["and","&","are","great","friends"]

preferred_arr << nil while preferred_arr.length < other_arr.length
preferred_arr.zip(other_arr).flatten.compact
#=> ["Cat", "and", "Dog", "&", "Mouse", "are", "great", "friends"]

答案 8 :(得分:1)

要处理as大小都不相同的情况:

a.zip(s).flatten.compact | s
  • .compact将在nil大于a时删除s
  • | s将在s小于a时添加s中剩余的项目

答案 9 :(得分:0)

交织任意大小的2D数组

arr = [["Cat", "Dog", "Mouse"],
 ["and", "&"],
 ["hello", "there", "you", "boo", "zoo"]]

max_count = arr.map(&:count).max
max_count.times.map{|i| arr.map{|a| a[i]}}.flatten.compact

#=> ["Cat", "and", "hello", "Dog", "&", "there", "Mouse", "you", "boo", "zoo"]

答案 10 :(得分:0)

合并多个数组的一种非常明确的方法是将它们解包为一个数组。这对许多语言的工作方式几乎相同,因此我更喜欢这种方法,因为它很简单,而且开发人员对它很熟悉。

a = ["Cat", "Dog", "Mouse"]
s = ["and", "&"]

[*a, *s]
#=> ["Cat", "Dog", "Mouse", "and", "&"]

答案 11 :(得分:-2)

arr = [0, 1]
arr + [2, 3, 4]

//outputs [0, 1, 2, 3, 4]