Как отсортировать Ruby Hash по числовому значению? - PullRequest
150 голосов
/ 29 марта 2010

У меня есть встречный хеш, который я пытаюсь отсортировать по количеству. Проблема, с которой я сталкиваюсь, заключается в том, что функция 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 появится первым в списке. Когда я пытаюсь показать, кто имеет наибольшее количество очков, это усложняет мою жизнь. :)

Есть идеи, как отсортировать хеш (или даже массив) по размеру числового значения?

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

Ответы [ 4 ]

257 голосов
/ 29 марта 2010

Понятия не имею, как вы получили свои результаты, поскольку они не будут сортироваться по строковому значению ... Вы должны обратить 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}
81 голосов
/ 07 апреля 2013

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

metrics.sort_by(&:last)
14 голосов
/ 30 марта 2010

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

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

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

9 голосов
/ 29 марта 2010

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

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]]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...