使用sort_by排序,前面出现nils

时间:2016-03-02 10:06:06

标签: arrays ruby sorting

有没有办法使用sort_by并让nil出现在前面。

例如

[-1, 2, 3, nil, nil].sort_by &some_block

应该给出

#=> [nil, nil, -1, 2, 3]

它与this question类似,但那里的解决方案不适用于负值。

3 个答案:

答案 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转换为使其有效的人工值对我来说是美学上令人不悦的。