如何使用分隔符

时间:2017-01-05 15:54:17

标签: arrays ruby

我有以下数组:

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

在不改变值的顺序的情况下,我需要在每次出现arr时将0细分为更小的数组,这样结果将是:

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

如果arr是一个字符串,我可以使用.split("0")然后将分隔符添加到每个子数组。在普通的Ruby数组中,.split()最有效的等价是什么?

2 个答案:

答案 0 :(得分:4)

Enumerable#slice_before完成了这件事:

arr = [0, 1, 1, 2, 3, 1, 0, 0, 1]
p arr.slice_before(0).to_a
# => [[0, 1, 1, 2, 3, 1], [0], [0, 1]]

在repl.it上查看:https://repl.it/FBhg

答案 1 :(得分:0)

ActiveSupport defines an Array#split method in Ruby以来,我们可以将其作为起点:

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+/ 吗?