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

Chr*_*det 103 ruby arrays

我有以下代码:

a = ["Cat", "Dog", "Mouse"]
s = ["and", "&"]
Run Code Online (Sandbox Code Playgroud)

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

["Cat", "and", "Dog", "&", "Mouse"]
Run Code Online (Sandbox Code Playgroud)

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

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

Dig*_*oss 168

你可以这样做:

a.zip(s).flatten.compact
Run Code Online (Sandbox Code Playgroud)

  • ["a","b"] .concat(["c","d"])#=> ["a","b","c","d"] (114认同)
  • @Leo,@ chuck:如果你看过这个例子,你会发现Chris想要*交错*元素,而不是*连接*它们.基本上,他想要`[a,s] .transpose`,除了两行不符合,留下`#zip`作为明显的解决方案.而且我不相信他的意思是他真的关心'a`是否被改变了......我认为他根本就没有评论变异与功能解决方案,他只是试图描述这种模式. (30认同)
  • +1是唯一真正阅读blummin'问题的人!> _ < (15认同)
  • 更重要的是,如果这两个数组的长度不相等怎么办?特别是如果s是较长的一个?我想我可以放心地假设克里斯给出的例子不是他正在使用的实际数据.考虑:[] .zip [1,2] => nil(很难在#flatten上调用)[3,4] .zip([1,3,5,7])=> [[3 ,1],[4,3]](哎呀,猜测我们不关心第二个数组中的最后几个元素) (5认同)
  • 如果`a`有超过3个元素怎么办? (4认同)

Mic*_*ker 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并将结果分配给变量.

针对此页面上的一些评论,这两个解决方案将适用于任何大小的数组.

  • 这给了`["Cat","Dog","Mouse","and","&"]`,这不是OP想要的. (11认同)

Dou*_*las 28

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

new_array = a | s
Run Code Online (Sandbox Code Playgroud)

  • 为一个被低估的、简单的、优雅的解决方案授予 +1。 (2认同)
  • 但是,元素的顺序不是 OP 想要的。 (2认同)

小智 6

s.inject(a, :<<)

s   #=> ["and", "&"]
a   #=> ["Cat", "Dog", "Mouse", "and", "&"]
Run Code Online (Sandbox Code Playgroud)

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


Abd*_*bdo 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"]
Run Code Online (Sandbox Code Playgroud)

  • 太好了!一个限制,第一个数组必须是最长的. (2认同)

Shu*_*ary 6

a处理&s大小不同的情况:

a.zip(s).flatten.compact | s
Run Code Online (Sandbox Code Playgroud)
  • .compactnila大于时将删除s
  • | s将从小于时s添加剩余项目as


Mic*_*ohl 5

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

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