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))     }

对于这三种方法中的每一种,确保零结果总是被排序到最底层的最鲁莽的方法是什么?
条件:
潜在哈希值的范围未知(哈希值始终为整数)
无法修改valueize方法
可以修改排序块

最佳答案

一个简单的方法(使用ick的maybe来保持它的紧凑性,如果你觉得更容易接受的话,做一个作业+有条件的):

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 }

关于ruby - 按方法的结果对哈希进行排序,将无结果排在最底,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12997016/

10-11 06:03