如何使用null作为分隔符拆分数组?

时间:2013-06-24 23:07:23

标签: ruby

我正在寻找转换方法:

[1,2,3,nil,4,5,nil,6,7,8,9] 

成:

[[1,2,3],[4,5],[6,7,8,9]]

在Ruby中有没有内置的方法呢?

5 个答案:

答案 0 :(得分:6)

我会用:

[1,2,3,nil,4,5,nil,6,7,8,9].slice_before{ |e| e.nil? }.map(&:compact)
=> [[1, 2, 3], [4, 5], [6, 7, 8, 9]]

slice_before非常强大,当您想要将数组分成块时,可以通过传入正则表达式来搜索重复模式,也可以通过块来计算。这里总结得太强大,所以花些时间阅读文档并使用示例。

答案 1 :(得分:4)

这应该有效:

array = [1,2,3,nil,4,5,nil,6,7,8,9]
array.inject([[]]) do |result, number|
  number ? result.last << number : result << []
  result
end

#=> [[1, 2, 3], [4, 5], [6, 7, 8, 9]]

解释时间: - )

  • inject从包含空数组的数组开始
  • 对于每个元素,它会检查它是否为nil
  • 如果不是,则将当前号码附加到前一个数组
  • 如果是,则会创建一个新的空数组
  • 同时更新结果,这是一个数组数组

- 编辑 -

检查David的回复我检查了Rails的实现:

def split(value = nil)
  using_block = block_given?

  inject([[]]) do |results, element|
    if (using_block && yield(element)) || (value == element)
      results << []
    else
      results.last << element
    end

    results
  end
end

如果跳过块实现,它具有与我的代码完全相同的结构。好极了! :)

答案 2 :(得分:2)

[1,2,3,nil,4,5,nil,6,7,8,9].split(nil)

哎呀array#split是Rails method

答案 3 :(得分:1)

我发现了一种有趣的东西。可能有一种方法可以缩短它:

[1,2,3,nil,4,5,nil,6,7,8,9].chunk {|e| e.nil?}.select {|e| not e[0]}.flatten(1).delete_if {|e| not e}

答案 4 :(得分:0)

我会加入数组,然后拆分数组。

a =[1,2,3,nil,4,5,nil,6,7,8,9] 

a = a.join("-").split("--")
a.map! { |a| a.split("-") }
a.map! {|e| e.map! {|f| f.to_i}}
puts a.inspect

#[[1, 2, 3], [4, 5], [6, 7, 8, 9]]

进行编辑(基于注释),使其再次成为整数。但仍然不是一个好的答案。