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

3つの並べ替えのそれぞれについて、nilの結果が常に一番下に並べ替えられるようにするための最も厄介な方法は何ですか?

条件:

  • 潜在的なハッシュ値の範囲は不明です(ハッシュ値は常に整数になります)
  • valueizeメソッドは変更できません
  • ソートブロックは変更できます
4

1 に答える 1

4

簡単なアプローチ(コンパクトに保つ​​ために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 }
于 2012-10-21T10:45:13.027 に答える