我有以下代码:
a = ["Cat", "Dog", "Mouse"]
s = ["and", "&"]
我想将数组s
合并到数组a
中,这会给我:
["Cat", "and", "Dog", "&", "Mouse"]
浏览Ruby Array和Enumerable docs,我没有看到这样的方法。
有没有办法可以在不迭代每个数组的情况下做到这一点?
答案 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)
要处理a
和s
大小都不相同的情况:
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]