你如何将一个数组添加到Ruby中的另一个数组,而不是最终的多维结果?

somearray = ["some", "thing"] anotherarray = ["another", "thing"] somearray.push(anotherarray.flatten!) 

我期望

 ["some","thing","another","thing"] 

你有一个可行的想法,但#flatten! 是在错误的地方 – 它平坦的接收器,所以你可以用它来[1, 2, ['foo', 'bar']] [1,2,'foo','bar']

我无疑忘记了一些方法,但是你可以连接

 a1.concat a2 a1 + a2 # creates a new array, as does a1 += a2 

prepend / append

 a1.push(*a2) # note the asterisk a2.unshift(*a1) # note the asterisk, and that a2 is the receiver 

拼接

 a1[a1.length, 0] = a2 a1[a1.length..0] = a2 a1.insert(a1.length, *a2) 

追加和变平

 (a1 << a2).flatten! # a call to #flatten instead would return a new array 

你可以使用+运算符!

 irb(main):001:0> a = [1,2] => [1, 2] irb(main):002:0> b = [3,4] => [3, 4] irb(main):003:0> a + b => [1, 2, 3, 4] 

你可以在这里阅读关于数组类的所有信息: http : //ruby-doc.org/core/classes/Array.html

最简洁的方法是使用Array#concat方法; 它不会创build一个新的数组(不像Array#+会做同样的事情,但创build一个新的数组)。

直接从文档( http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-concat ):

CONCAT(other_ary)

将other_ary的元素添加到自己。

所以

 [1,2].concat([3,4]) #=> [1,2,3,4] 

如果将数组作为参数传入, Array#concat将不会变平multidimensional array。 你需要分开处理:

 arr= [3,[4,5]] arr= arr.flatten #=> [3,4,5] [1,2].concat(arr) #=> [1,2,3,4,5] 

最后,你可以使用我们的corelib gem( https://github.com/corlewsolutions/corelib ),它为Ruby核心类增加了有用的帮手。 特别是我们有一个Array#add_all方法,它将在执行concat之前自动将multidimensional array展平。

这里有两种方法,注意在这种情况下,第一种方式返回一个新的数组(转化为somearray = somearray + anotherarray)

 somearray = ["some", "thing"] anotherarray = ["another", "thing"] somearray += anotherarray # => ["some", "thing", "another", "thing"] somearray = ["some", "thing"] somearray.concat anotherarray # => ["some", "thing", "another", "thing"] 

试试这个,它会结合你的数组删除重复

 array1 = ["foo", "bar"] array2 = ["foo1", "bar1"] array3 = array1|array2 

http://www.ruby-doc.org/core/classes/Array.html

进一步的文档看“Set Union”

简单的方法适用于Ruby版本> = 2.0,但不适用于旧版本:

 irb(main):001:0> a=[1,2] => [1, 2] irb(main):003:0> b=[3,4] => [3, 4] irb(main):002:0> c=[5,6] => [5, 6] irb(main):004:0> [*a,*b,*c] => [1, 2, 3, 4, 5, 6] 

(array1 + array2).uniq

这样你首先获得array1元素。 你将不会有重复。

["some", "thing"] + ["another" + "thing"]

这个问题本质上是“如何在Ruby中连接数组”。 自然地,答案是使用几乎每个答案中提到的concat+

这个问题的一个自然延伸是“如何在Ruby中执行二维数组的行级联”。 当我search“ruby concatenate matrices”时,这个SO问题是最重要的结果,所以我想我将这个问题的答案留给子孙后代。


在某些应用程序中,您可能想要“串联”两个二维数组。 就像是,

 [[a, b], | [[x], [[a, b, x], [c, d]] | [y]] => [c, d, y]] 

这就像“扩充”一个matrix。 例如,我使用这种技术来创build一个单一的邻接matrix来表示一串较小的matrix。 如果没有这个技巧,我不得不以一种可能容易出错或令人沮丧的方式迭代组件。 例如,我可能不得不做一个each_with_index 。 相反,我把zip和flatten结合起来如下,

 # given two multi-dimensional arrays that you want to concatenate row-wise m1 = [[:a, :b], [:c, :d]] m2 = [[:x], [:y]] m1m2 = m1.zip(m2).map(&:flatten) # => [[:a, :b, :x], [:c, :d, :y]] 

如果新数据可以是数组或标量,并且要防止新数据嵌套(如果是数组),则splat运算符非常棒! 它为标量返回一个标量,为数组返回一个未压缩的参数列表。

 1.9.3-p551 :020 > a = [1, 2] => [1, 2] 1.9.3-p551 :021 > b = [3, 4] => [3, 4] 1.9.3-p551 :022 > c = 5 => 5 1.9.3-p551 :023 > a.object_id => 6617020 1.9.3-p551 :024 > a.push *b => [1, 2, 3, 4] 1.9.3-p551 :025 > a.object_id => 6617020 1.9.3-p551 :026 > a.push *c => [1, 2, 3, 4, 5] 1.9.3-p551 :027 > a.object_id => 6617020 

我发现更容易推或追加数组,然后将它们压扁,如下所示:

 somearray = ["some", "thing"] anotherarray = ["another", "thing"] somearray.push anotherarray # => ["some", "thing", ["another", "thing"]] #or somearray << anotherarray # => ["some", "thing", ["another", "thing"]] somearray.flatten! # => ["some", "thing", "another", "thing"] somearray # => ["some", "thing", "another", "thing"] 

我很惊讶没有人提到reduce ,当你有一个数组数组时,效果很好:

 lists = [["a", "b"], ["c", "d"]] flatlist = lists.reduce(:+) # ["a", "b", "c", "d"] 

在@ Pilcrow的答案详细说明巨大的数组唯一合适的答案是concat因为是快速的,并没有分配一个新的对象被垃圾收集时,循环内部操作。

这是基准:

 require 'benchmark' huge_ary_1 = Array.new(1_000_000) { rand(5_000_000..30_000_00) } huge_ary_2 = Array.new(1_000_000) { rand(35_000_000..55_000_00) } Benchmark.bm do |bm| p '-------------------CONCAT ----------------' bm.report { huge_ary_1.concat(huge_ary_2) } p '------------------- PUSH ----------------' bm.report { huge_ary_1.push(*huge_ary_2) } end 

结果:

  user system total real "-------------------CONCAT ----------------" 0.000000 0.000000 0.000000 ( 0.009388) "------------------- PUSH ----------------" example/array_concat_vs_push.rb:13:in `block (2 levels) in <main>': stack level too deep (SystemStackError) 

正如你所看到的,当数组足够大时,使用push抛出一个ERRORstack level too deep (SystemStackError)