如何使用分隔符将Ruby数组拆分为大小不等的子数组

4

I have the following array:

arr = [0, 1, 1, 2, 3, 1, 0, 0, 1]

在不改变值的顺序的情况下,我需要在每个 0 出现的地方将 arr 细分为较小的数组,以便结果如下:

arr = [ [0, 1, 1, 2, 3, 1], [0], [0, 1] ]

如果arr是一个字符串,我可以使用.split("0"),然后在每个子数组前添加分隔符。对于数组来说,在纯Ruby中最有效的等效函数是什么?

1
我还不太理解这个问题,但通常来说,如果你正在处理类似树形结构的数据,递归往往是最好的通用解决方案。 - Dave Newton
请阅读“[ask]”以及链接的页面,还有“[mcve]”。如果没有代码,看起来就像是要求我们为您编写教程或编写代码,这两者都不是主题。 - the Tin Man
这似乎是对Array的复杂使用。我会思考在解析时是否有更适合的数据类型可用,而不是将数组转换为嵌套数组。如果不知道这将在哪里使用,很难提供建议。但我会考虑使用对象构建树形结构。例如,每行都成为自己的对象,并具有其父对象和子对象的信息。您需要保留顺序,这可以使用子对象作为对象数组来完成。 - Lee-Jon
好主意。在这种情况下,对象可以解决问题。谢谢!(即使这不是最好的方法,我仍然很想知道如何按照我想要的方式细分数组,并已相应地编辑了我的原始问题) - DJK
2个回答

4

我之前也想过这个方法,但没有正确应用。你发现得很好。 - tadman
太好了,谢谢!我不知道为什么在文档中错过了这个方法。 - DJK

0

由于ActiveSupport在Ruby中定义了一个Array#split方法, 我们可以将其作为起点:

class Array
  def split(value = nil)
    arr = dup
    result = []
    if block_given?
      while (idx = arr.index { |i| yield i })
        result << arr.shift(idx)
        arr.shift
      end
    else
      while (idx = arr.index(value))
        result << arr.shift(idx)
        arr.shift
      end
    end
    result << arr
  end
end

# then, using the above to achieve your goal:
arr = [0, 1, 1, 2, 3, 1, 0, 0, 1]
arr.split(0).map { |sub| sub.unshift(0) }
# => [[0], [0, 1, 1, 2, 3, 1], [0], [0, 1]] 

请注意,您的算法口头表述(拆分和前置)是发生在这里的,但您的期望输出不同(由于split的工作方式,存在一个额外的零)。
您是否想要在每个零之前拆分?为此,您可以使用slice_before
您是否想要拆分但删除空数组?这可以通过在前置之前快速使用compact来完成,但您将失去[0]子数组。
您是否想要拆分但如果第一个元素为空则删除它
您是否想要在/0+/拆分

乔丹已经做到了; slice_before 是我需要的。我一直在尝试不使用ActiveSupport来完成它,但这仍然非常有用。谢谢! - DJK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接