Сортировка значений внутри хэша (с гранями сфинкса) - PullRequest
0 голосов
/ 20 марта 2012

Я использую Sphinx для возврата хэша граней. Возвращенный хеш выглядит так:

{:brand=>{"C Brand"=>170, "A Brand"=>17, "B Brand"=>160}, :store=>{"B Store"=>95, "C Store"=>1, "A Store"=>9}}

Хэш содержит название магазина / бренда, а также количество продуктов, связанных с ними. Мне нужно, чтобы значения внутри хеша были упорядочены по названию магазина / бренда, например:

{:brand=>{"A Brand"=>170, "B Brand"=>17, "C Brand"=>160}, :store=>{"A Store"=>9, "B Store"=>95, "C Store"=>1}}

Я много прочитал о сортировке хэшей, но, похоже, не могу найти правильный метод для работы.

Я использую Ruby 1.8.7.

Ответы [ 5 ]

2 голосов
/ 20 марта 2012

Чтобы отсортировать хеш по ключам в Ruby 1.9, выполните:

sorted_hash = Hash[unsorted_hash.sort]

Поскольку вы используете Ruby 1.8.7, вам придется сделать что-то вроде этого:

sorted_array_of_pairs = unsorted_hash.sort

или просто отсортируйте его, когда пришло время повторять:

unsorted_hash.sort.each do |k, v|
   # ...
end
1 голос
/ 20 марта 2012

Я предполагаю, что в ожидаемом результате произошла ошибка, она должна быть {:brand=>{"A Brand"=>17, "B Brand"=>160, "C Brand"=>170}, :store=>{"A Store"=>9, "B Store"=>95, "C Store"=>1}}

Относительно кода:

a = {:brand=>{"C Brand"=>170, "A Brand"=>17, "B Brand"=>160}, :store=>{"B Store"=>95, "C Store"=>1, "A Store"=>9}}
a.each {|k,v| a[k] = Hash[v.sort]}
0 голосов
/ 21 марта 2012

Спасибо всем, в конце концов я пошел с ...

hash.map{ |key,values| [ key, values.sort_by {|x| x.to_s.sort} ] }

.to_s был необходим, потому что некоторые названия брендов / магазинов были пустыми строками, и он мог сортировать целые числа.

0 голосов
/ 20 марта 2012
h = {:brand=>{"C Brand"=>170, "A Brand"=>17, "B Brand"=>160}, :store=>{"B Store"=>95, "C Store"=>1, "A Store"=>9}}
h.each{|k,v| h[k] = Hash[v.sort]}

Вам нужен Ruby 1.9, чтобы это работало.

0 голосов
/ 20 марта 2012

Если ваши хеши не слишком велики, и производительность на самом деле не является проблемой, вы все равно можете преобразовать свой хеш в массив, отсортировать массив и затем преобразовать его обратно в хеш (или OrderedHash, если вы используете ruby<1,9).Это немного наивно, но, по крайней мере, вы можете двигаться дальше, сосредоточиться на чем-то другом и вернуться к этому позже, когда это станет проблемой. </p>

...