Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby中将一个数组添加到另一个数组中,而不以多维结果结束?_Ruby_Arrays_Multidimensional Array - Fatal编程技术网

如何在Ruby中将一个数组添加到另一个数组中,而不以多维结果结束?

如何在Ruby中将一个数组添加到另一个数组中,而不以多维结果结束?,ruby,arrays,multidimensional-array,Ruby,Arrays,Multidimensional Array,我预料 somearray = ["some", "thing"] anotherarray = ["another", "thing"] somearray.push(anotherarray.flatten!) 您可以使用+操作符 ["some","thing","another","thing"] 您可以在此处阅读有关array类的所有信息: [“一些”,“东西”]+[“另一个”,“东西”]试试这个,它会将你的数组组合起来删除重复项 irb(main):001:0> a =

我预料

somearray = ["some", "thing"]

anotherarray = ["another", "thing"]

somearray.push(anotherarray.flatten!)

您可以使用
+
操作符

["some","thing","another","thing"]
您可以在此处阅读有关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]


进一步的文档查看“Set Union”

这里有两种方法,注意在本例中,第一种方法分配一个新数组(转换为somearray=somearray+anotherarray)


你有一个可行的想法,但是
#太简单了
放错了位置——它压平了接收器,因此您可以使用它将
[1,2,['foo','bar']]
转换为
[1,2,'foo','bar']

毫无疑问,我忘记了一些方法,但您可以连接:

somearray = ["some", "thing"]

anotherarray = ["another", "thing"]

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

somearray = ["some", "thing"]
somearray.concat anotherarray # => ["some", "thing", "another", "thing"]
a1.concat a2
a1 + a2              # creates a new array, as does a1 += a2
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)
前置/追加

somearray = ["some", "thing"]

anotherarray = ["another", "thing"]

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

somearray = ["some", "thing"]
somearray.concat anotherarray # => ["some", "thing", "another", "thing"]
a1.concat a2
a1 + a2              # creates a new array, as does a1 += a2
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)
拼接

somearray = ["some", "thing"]

anotherarray = ["another", "thing"]

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

somearray = ["some", "thing"]
somearray.concat anotherarray # => ["some", "thing", "another", "thing"]
a1.concat a2
a1 + a2              # creates a new array, as does a1 += a2
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)
追加并展平

somearray = ["some", "thing"]

anotherarray = ["another", "thing"]

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

somearray = ["some", "thing"]
somearray.concat anotherarray # => ["some", "thing", "another", "thing"]
a1.concat a2
a1 + a2              # creates a new array, as does a1 += a2
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我发现推送或附加数组,然后将它们放平比较容易,如下所示:

(a1 << a2).flatten!  # a call to #flatten instead would return a new array
somearray=[“some”,“thing”]
另一个数组=[“另一个”,“东西”]
somearray.push另一个数组#=>[“某个”、“某个”、“另一个”、“某个”]]
#或
somearray[“一些”,“东西”,“另一个”,“东西”]]
somearray.flatten!#=>[“一些”、“东西”、“另一个”、“东西”]
somearray#=>[“一些”、“东西”、“另一个”、“东西”]

最干净的方法是使用数组#concat方法;它不会创建新数组(与Array#+不同,Array#+会做同样的事情,但会创建新数组)

直接从文档()开始:

混凝土(其他) 将其他元素附加到自身

所以

数组#concat如果多维数组作为参数传入,则它不会展平。您需要单独处理:

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

最后,您可以使用我们的corelib gem()它为Ruby核心类添加了有用的助手。特别是我们有一个数组#add_all方法,该方法将在执行concat之前自动展平多维数组。

如果新数据可以是数组或标量,并且要防止新数据嵌套(如果是数组),则splat操作符是wesome!它为标量返回标量,为数组返回未打包的参数列表

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\u id
=> 6617020 
1.9.3-p551:024>a.push*b
=> [1, 2, 3, 4] 
1.9.3-p551:025>a.object\u id
=> 6617020 
1.9.3-p551:026>a.push*c
=> [1, 2, 3, 4, 5] 
1.9.3-p551:027>a.object\u id
=> 6617020 
(array1+array2)。uniq


通过这种方式,您首先获得数组1个元素。您将不会得到重复的元素。

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

这个问题的一个自然延伸是“如何在Ruby中执行2D数组的行连接”。当我在Google上搜索“Ruby连接矩阵”时,这个问题是最重要的结果,所以我想我会把这个(未询问但相关的)问题的答案留给后人


在某些应用程序中,您可能希望按行“连接”两个2D数组

arr= [3,[4,5]]
arr= arr.flatten   #=> [3,4,5]
[1,2].concat(arr)  #=> [1,2,3,4,5]
这有点像“增强”一个矩阵。例如,我使用这种技术创建一个邻接矩阵,用一堆较小的矩阵表示一个图。如果没有这种技术,我将不得不以一种容易出错或令人沮丧的方式对组件进行迭代。例如,我可能不得不使用_index
对每个_进行
e、 相反,我合并如下:

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

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

# 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]]

我很惊讶没有人提到
reduce
,当您有一个数组时,它可以很好地工作:

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]

详细说明@Pilcrow的答案对于大型数组来说,唯一合适的答案是
concat
+
),因为它速度快,在循环内操作时不会分配要垃圾收集的新对象

以下是基准:

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

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
用户系统总实际值
“--------------混凝土------------------”
0.000000   0.000000   0.000000 (  0.009388)
“--------------推-----”
示例/array_concat_vs_push.rb:13:in`block(2个级别)in':堆栈级别太深(SystemStackError)

如您所见,使用
push
会抛出错误
当数组足够大时,堆栈级别太深(SystemStackError)

只是另一种方法

       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)
这不会删除DUP,但是

a = ['a', 'b']
b = ['c', 'd']
arr = [a, b].flatten
删除重复

a|b
要将
b
附加到
a
并将结果存储到
a

a = ["some", "thing"]
b = ["another", "thing"]

在这两种情况下,
a
变为:

a += b
但是在前一种情况下,
b
的元素被附加到现有的
a
数组中,在后一种情况下,两个数组被连接在一起,结果存储在
a
somearray=[“some”,“thing”]

另一个数组=[“另一个”,“东西”]


somearray+anotherarray

这是一个or,它返回一个没有重复元素的数组,下面是一个例子,说明它可能没有按照他的要求执行,第一个数组中的两个“baz”变成一个,第二个数组中的“bar”没有添加。array1=[“foo”、“bar”、“baz”、“baz”]array2=[“foo1”、“bar1”、“bar”]array3=array1 | array2 array3#=>[“foo”、“bar”、“baz”、“foo1”、“bar1”]甚至更好:
array1 |=[“foo1”、“bar1”]#=>[“foo”、“bar”、“foo1”、“bar1”]
做得很好,因为我是唯一的一个(我能看到的5个)谁实际指出了代码的错误。+1使用push而不是concat可以避免创建第三个数组,因此这是la的首选