0

我正在寻找一种转换方法:

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

进入:

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

Ruby 中有没有内置的方法可以做到这一点?

4

5 回答 5

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当您想通过传入正则表达式搜索重复模式或您可以通过块计算的东西将数组分成块时,它真的很强大。在这里总结太强大了,所以花点时间阅读文档并使用示例。

于 2013-06-24T23:44:29.003 回答
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]]

解释时间:-)

  • 注入从一个包含空数组的数组开始
  • 对于每个元素,它检查它是否为 nil
  • 如果不是,它将当前数字附加到前一个数组
  • 如果是,它会创建一个新的空数组
  • 所有这些都在更新结果时,这是一个数组数组

- 编辑 -

检查大卫的回复,我检查了 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

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

于 2013-06-24T23:18:39.337 回答
2
[1,2,3,nil,4,5,nil,6,7,8,9].split(nil)

Whoopsarray#split是一种 Rails方法

于 2013-06-24T23:17:19.993 回答
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}
于 2013-06-24T23:34:50.760 回答
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]]

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

于 2013-06-24T23:16:16.057 回答