2
def valueize(val)
  # randomly returns nil or random integer ([-100 to +100] + val)
  ((rand(100) % 3) == 0) ? nil : (rand(200)-100+val)
end

hash = {
  x: 11,
  y: 22,
  z: 33
 }

sort_by_abs = hash.sort_by{ |k, v|  (valueize(v)).abs }
sort_by_min = hash.sort_by{ |k, v|  (valueize(v))     }
sort_by_max = hash.sort_by{ |k, v| -(valueize(v))     }

对于三种排序中的每一种,确保 nil 结果始终排在底部的最红宝石方法是什么?

条件:

  • 潜在哈希值的范围未知(哈希值始终为整数)
  • 无法修改valueize 方法
  • 排序块可以修改
4

1 回答 1

4

一个简单的方法(使用 ick'smaybe只是为了保持紧凑,如果你觉得更舒服,可以做一个赋值+条件):

inf = Float::INFINITY
sort_by_abs = hash.sort_by { |k, v| valueize(v).maybe.abs || inf }
sort_by_min = hash.sort_by { |k, v| valueize(v) || inf }
sort_by_max = hash.sort_by { |k, v| valueize(v).maybe.send(:-@) || inf }
于 2012-10-21T10:45:13.027 回答