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/