Как отсортировать Ruby Hash по номеру?

У меня есть встречный хеш, который я пытаюсь сортировать по счету. Проблема, с которой я сталкиваюсь, заключается в том, что функция Hash.sort по умолчанию сортирует числа, такие как строки, а не размер числа.

то есть. Учитывая Хэш:

metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 10 }

Запуск этого кода:

metrics.sort {|a1,a2| a2[1]<=>a1[1]}

вернет отсортированный массив:

[ 'siteb.com', 9, 'sitea.com', 745, 'sitec.com', 10]

Несмотря на то, что 745 - это большее число, чем 9, 9 появится первым в списке. Когда вы пытаетесь показать, кто имеет верхний счет, это затрудняет мою жизнь.:)

Любые идеи о том, как сортировать хэш (или массив равномерно) по размеру числа?

Я ценю любую помощь.

Ответ 1

Не знаю, как вы получили свои результаты, так как он не сортирует по строковому значению... Вы должны отменить a1 и a2 в своем примере

Лучший способ в любом случае (согласно Младену):

metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 10 }
metrics.sort_by {|_key, value| value}
  # ==> [["siteb.com", 9], ["sitec.com", 10], ["sitea.com", 745]]

Если вам нужен хеш, вы можете использовать to_h (в Ruby 2.0 +)

metrics.sort_by {|_key, value| value}.to_h
  # ==> {"siteb.com" => 9, "sitec.com" => 10, "sitea.com", 745}

Ответ 2

Поскольку значение является последней записью, вы можете сделать:

metrics.sort_by(&:last)

Ответ 3

Уже ответил, но все же. Измените свой код на:

metrics.sort {|a1,a2| a2[1].to_i <=> a1[1].to_i }

Преобразуется в строки по пути или нет, это выполнит задание.

Ответ 4

Это не поведение, которое я вижу:

irb(main):001:0> metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" =>
 10 }
=> {"siteb.com"=>9, "sitec.com"=>10, "sitea.com"=>745}
irb(main):002:0> metrics.sort {|a1,a2| a2[1]<=>a1[1]}
=> [["sitea.com", 745], ["sitec.com", 10], ["siteb.com", 9]]

Возможно ли, что где-то вдоль строки ваши числа преобразуются в строки? Есть ли еще код, который вы не публикуете?