我正在寻找转换方法:
[1,2,3,nil,4,5,nil,6,7,8,9]
成:
[[1,2,3],[4,5],[6,7,8,9]]
在Ruby中有没有内置的方法呢?
答案 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]]
解释时间: - )
- 编辑 -
检查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]]
进行编辑(基于注释),使其再次成为整数。但仍然不是一个好的答案。