有没有办法使用sort_by
并让nil
出现在前面。
例如
[-1, 2, 3, nil, nil].sort_by &some_block
应该给出
#=> [nil, nil, -1, 2, 3]
它与this question类似,但那里的解决方案不适用于负值。
答案 0 :(得分:3)
如果您的其他值是数字,则可以使用Float::INFINITY
:
[-1, 2, 3, nil, nil].sort_by { |n| n || -Float::INFINITY }
#=> [nil, nil, -1, 2, 3]
另一种写这个的方法是:
sort_by { |n| n ? n : -Float::INFINITY }
或更明确地关于nil
:
sort_by { |n| n.nil? ? -Float::INFINITY : n }
答案 1 :(得分:2)
> [-1, 2, 3, nil, nil].sort_by{|x| [(x.nil?)?0:1, x]}
=> [nil, nil, -1, 2, 3]
这避免了将int与nil进行比较,通过引用<=>
对数组的短路行为的优势
答案 2 :(得分:0)
我建议
def sort_by_with_val_first(arr, val=nil)
([val]*arr.count(val)).concat (arr-[val]).sort_by { |e| yield e }
end
arr = [-1, 2, 3, nil, nil, -4]
sort_by_with_val_first(arr) { |x| x.abs }
#=> [nil, nil, -1, 2, 3, -4]
我喜欢这样的内容:“在val
中创建一个由arr
元素组成的数组,然后将此数组与arr
连接,并删除元素val
,并将其排序为期望”。将val
中的sort_by
转换为使其有效的人工值对我来说是美学上令人不悦的。