我有一个像这样的数组:
[nil, nil, nil, 2, 4, 6, 1, nil, nil, 3, 4, 6]
Run Code Online (Sandbox Code Playgroud)
我需要的是一个很好的方法来删除所有领先的 nils(所以compact!很糟糕),并删除nils的数量(所以drop_while是坏的).
这有三种方法.请注意,以下内容经过了多次编辑.
arr0 = [nil, nil, nil, 2, 4, 6, 1, nil, nil, 3, 4, 6]
arr1 = [nil, nil]
arr2 = [1, 2]
Run Code Online (Sandbox Code Playgroud)
#1
def remove_leading_nils(arr)
i = arr.index { |e| !e.nil? } || arr.size
arr.slice!(0...i)
i
end
remove_leading_nils(arr0) #=> 3
arr0 #=> [2, 4, 6, 1, nil, nil, 3, 4, 6]
remove_leading_nils(arr1) #=> 2
arr1 #=> []
remove_leading_nils(arr2) #=> 0
arr2 #=> [1,2]
Run Code Online (Sandbox Code Playgroud)
#2
def remove_leading_nils(arr)
arr.size.times.with_object([]) { |_,a| a << arr.shift unless arr.first }.size
end
Run Code Online (Sandbox Code Playgroud)
#3
我更喜欢这个,因为它更简单,我认为它最好:
def remove_leading_nils(arr)
sz = arr.size
arr.shift while !arr.empty? && arr.first.nil?
sz - arr.size
end
Run Code Online (Sandbox Code Playgroud)
方法#2和#3具有相同的返回值arr0,arr1并且arr2一样的方法#1.
| 归档时间: |
|
| 查看次数: |
92 次 |
| 最近记录: |