【问题标题】:Ruby: How to concatenate array of arrays into oneRuby:如何将数组数组连接成一个
【发布时间】:2012-01-07 02:24:57
【问题描述】:

我在 Ruby on Rails (3.1) 中有一个数组数组,其中所有内部数组的大小都不同。有没有一种方法可以轻松地连接所有内部数组以获得一个包含所有项目的大一维数组?

我知道你可以使用 Array::concat 函数来连接两个数组,我可以像这样做一个循环来依次连接它们:

concatenated = Array.new
array_of_arrays.each do |array|
    concatenated.concat(array)
end

但我想知道是否有像 Ruby 单线器这样可以更清洁的方式。

感谢您的帮助。

【问题讨论】:

  • 按照建议,flatten(1) 是您想要的,但我想指出您可以将上面的内容写成 array_of_arrays.reduce(:concat)

标签: ruby arrays multidimensional-array concatenation


【解决方案1】:

您正在寻找#flatten:

concatenated = array_of_arrays.flatten

默认情况下,这将递归地展平列表。 #flatten 接受一个可选参数来限制递归深度——文档列出了示例来说明差异。

【讨论】:

  • 更好flatten(1)。数组中的元素可以是数组本身,它们会被递归展平。
  • 可选参数需要 Ruby 1.8.7 或更高版本
  • 也作为一般建议;建议使用flatten!(n),因为这会修改对象而不是复制它。通过减少需要完成的 GC 量,使用改变对象的方法可以提高性能。
  • 1.这是非常有效的死灵法术 :D 2. 我不会把它作为一个一般推荐,尤其是现在函数式编程是一个模因。但即使不考虑这一点,我认为通常破坏输入不好,引用透明度好,并且应该使用 bang 方法作为优化,其中可观察的结果与使用副本相同,除非你有基于程序逻辑的理由想要公开就地突变。
【解决方案2】:

或更笼统地说:

array_of_arrays.reduce(:concat)

【讨论】:

  • 这不会像 flatten 那样破坏 3、4 或 5+ 维数组;) 使用 #flatten,您需要非常清楚数组包含的内容,因为它是递归的方法,这可能是可取的,也可能是不可取的。
  • 啊,好的。当我将它用于类似的事情时,我会记住这一点。在这种情况下,它不是很重要,因为它们是简单的数组并且递归可以正常工作。
  • @d11wtq: 没错,这就是为什么 Ruby 1.9 有 flatten(n)
  • 请注意,此代码将更改原始 array_of_arrays,如果您仍打算在其他地方使用原始数组,这可能会导致问题。
  • 为避免更改原件,您可以使用array_of_arrays.reduce :+。但请注意,如果array_of_arrays 为空,则这两个都返回nil,而flatten 返回[]
【解决方案3】:

你可以使用扁平化!方法。例如。 a = [ 1, 2, [3, [4, 5] ] ] a.flatten! #=> [1, 2, 3, 4, 5]

【讨论】:

  • 通过使用a.flatten!,您还可以防止复制数组,节省内存和垃圾收集。
猜你喜欢
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多