【问题标题】:ruby flatten and compact array full of empty arraysruby 展平和紧凑的数组,充满了空数组
【发布时间】:2018-06-14 23:59:57
【问题描述】:

在我的 ruby​​ 项目中,我有一个数组数组,这是执行一些繁重的图形遍历的结果

示例:

[[], [1, 2, 3, 4, 5], [[], [], [[], [], [34, 54, 23, 45]]]]

我希望最终产品是

[[1, 2, 3, 4, 5], [34, 54, 23, 45]]

扁平化会让我留下

[1, 2, 3, 4, 5, 34, 54, 23, 45]

所以我不想这样

我被困住了,可以使用一些帮助来解决这个问题

到目前为止,我有

class Array
  def flatten_blanks
    each{ |elem| elem.flatten_blanks if elem.is_a?(Array) }
    reject!{ |elem| elem.is_a?(Array) && elem.length < 1 }
    self
  end
end

这很接近但给我留下了类似的东西

[[[[[[[1, 2, 3, 4, 5]]]]]]], [[[[[[[34, 54, 23, 45]]]]]]]

【问题讨论】:

  • 你的图遍历算法是否也会给你留下一个像[[],[1,2,[3,4]]]这样的数组,如果是的话,你想要的结果是什么?如果这不能发生,即如果每个子数组是空的,或者只包含非数组元素,或者只包含数组元素,你可以递归地遍历你的数组并收集这些子数组subarr,其中subarr.first.class 既不是NilClass 也不是Array

标签: arrays ruby flatten


【解决方案1】:
squeeze = -> (arr, acc = []) do
  case arr.compact.first
  when NilClass then acc
  when Array
    arr.reject(&:empty?).map { |e| squeeze.(e, acc) }.first
  else acc << arr
  end
end
squeeze.(arr)
#⇒ [[1, 2, 3, 4, 5], [34, 54, 23, 45]]

【讨论】:

  • 唯一需要注意的是,如果子 Array 包含 nil 作为第一个元素,则整个 Array 将被拒绝。
  • @engineersmnky 是的,确实如此。我会添加紧凑的。
【解决方案2】:

以你为例,它可以解决问题:

array = [[], [1, 2, 3, 4, 5], [[], [], [[], [], [34, 54, 23, 45]]]]
array.map(&:flatten).delete_if(&:empty?)

它将产生:

[[1, 2, 3, 4, 5], [34, 54, 23, 45]]

【讨论】:

  • 如果任何嵌套数组至少有两个非空元素,它将不起作用。我想知道谁对此投了赞成票。
【解决方案3】:
require 'json'

arr = [[], [1, 2, 3, 4, 5], [[], [], [[], [], [34, 54, 23, 45]]]]

JSON.parse("[#{arr.to_json.scan(/\[[^\[\]]+\]/).join(',')}]")
  #=> [[1, 2, 3, 4, 5], [34, 54, 23, 45]]

也可以使用递归方法(类似于 mudsie 的递归过程)。

def recurse(arr)
  arr.each_with_object([]) { |e,a|
    e.first.is_a?(Array) ? a.concat(recurse e) : a << e unless e.empty? }
end

recurse(arr)
  #=> [[1, 2, 3, 4, 5], [34, 54, 23, 45]]

【讨论】:

  • 太棒了。我想过滥用json,但没有想出这么优雅的解决方案。
【解决方案4】:

让我们称你的数组为 arr

arr.map(&:flatten).reject(&:empty?)

稍微解释一下,您对数组的元素而不是数组本身运行 flatten,然后删除空子数组。

【讨论】:

    猜你喜欢
    • 2015-10-17
    • 2020-02-13
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 2017-09-12
    • 2017-07-11
    • 2019-02-03
    • 1970-01-01
    相关资源
    最近更新 更多