Ruby:如何将数组连接成一个数组
我在RubyonRails(3.1)中有一个数组,其中所有内部数组的大小都不同。有没有一种方法可以轻松地连接所有内部数组,以获得一个包含所有项的大一维数组 我知道您可以使用Array::concat函数连接两个数组,我可以执行一个循环来按顺序连接它们,如下所示:Ruby:如何将数组连接成一个数组,ruby,arrays,multidimensional-array,concatenation,Ruby,Arrays,Multidimensional Array,Concatenation,我在RubyonRails(3.1)中有一个数组,其中所有内部数组的大小都不同。有没有一种方法可以轻松地连接所有内部数组,以获得一个包含所有项的大一维数组 我知道您可以使用Array::concat函数连接两个数组,我可以执行一个循环来按顺序连接它们,如下所示: concatenated = Array.new array_of_arrays.each do |array| concatenated.concat(array) end 但我想知道是否有一个Ruby one衬里可以以更干
concatenated = Array.new
array_of_arrays.each do |array|
concatenated.concat(array)
end
但我想知道是否有一个Ruby one衬里可以以更干净的方式完成
谢谢您的帮助。您正在寻找:
默认情况下,这将递归地展平列表<代码>#展平接受一个可选参数来限制递归深度–文档列出了示例来说明差异。或更一般地说:
array_of_arrays.reduce(:concat)
你可以使用扁平!方法。如。
a=[1,2,3,4,5]]
a、 展平!#=>[1、2、3、4、5]
这不会以展平的方式破坏3、4或5维以上的阵列;)使用#flatte
,您需要非常清楚数组包含的内容,因为它是一种递归方法,可能需要也可能不需要。啊,好的。当我用它做类似的事情时,我会记住这一点。在这种情况下,这不是很重要,因为它们是简单的数组,递归工作很好。@d11wtq:这是真的,这就是为什么Ruby 1.9有flatte(n)
注意,此代码将更改数组的原始array\u
,如果您仍计划在其他地方使用原始数组,则可能会导致问题。为了避免更改原始数组,您可以执行数组中的数组。reduce:+。但请注意,如果数组中的数组为空,则这两个函数都返回nil
,而flatten
返回[]
。更好的flatten(1)
。数组中的元素可以是数组本身,它们将被递归展平;建议使用展平!(n)
,因为这会就地修改对象,而不是复制对象。通过减少需要执行的GC量,使用就地更改对象的方法可以提高性能。1。这是非常强大的巫术:D2。我不会把它作为一般性的建议,尤其是现在函数式编程是一种模因。但即使不考虑这一点,我也会认为,一般来说,破坏输入是不好的,引用透明性是好的,并且应该使用bang方法作为优化,其中可观察的结果与使用副本的结果相同,除非您有基于程序逻辑的理由想要公开就地突变。正如所建议的,flatte(1)
是您想要的,但我想指出的是,您可以将上面的内容写成array\u of\u array.reduce(:concat)
。使用a.flatte代码>还可以防止对数组进行复制,从而节省内存和垃圾收集。
array_of_arrays.reduce(:concat)