Как отсортировать Хеш Ruby по числовому значению?

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

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

Я ценю любую справку.

151
задан Marc-André Lafortune 29 March 2010 в 21:28
поделиться

3 ответа

Понятия не имею, как вы получили свои результаты, поскольку он не будет отсортирован по строковому значению ... Вам следует поменять местами 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}
263
ответ дан 23 November 2019 в 22:14
поделиться

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

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

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

14
ответ дан 23 November 2019 в 22:14
поделиться

Это не то поведение, которое я наблюдаю:

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

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

9
ответ дан 23 November 2019 в 22:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: