Как отсортировать 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]]
Возможно ли, что где-то вдоль строки ваши числа преобразуются в строки? Есть ли еще код, который вы не публикуете?