У меня есть встречный хеш, который я пытаюсь отсортировать по количеству. Проблема, с которой я сталкиваюсь, состоит в том что числа видов функции 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 будет казаться первым в списке. При попытке показать, у кого есть главное количество, это делает мою жизнь трудной.:)
Какие-либо идеи о том, как отсортировать хеш (или массив даже) размером числового значения?
Я ценю любую справку.
Понятия не имею, как вы получили свои результаты, поскольку он не будет отсортирован по строковому значению ... Вам следует поменять местами 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}
Уже ответили, но все же. Измените свой код на:
metrics.sort {|a1,a2| a2[1].to_i <=> a1[1].to_i }
Преобразовано в строки по ходу дела или нет, это выполнит свою работу.
Это не то поведение, которое я наблюдаю:
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]]
Возможно ли, что где-то на линии ваши числа преобразуются в строки? Есть ли еще код, который вы не выкладываете?