Сортировка значений в хэше (с гранями сфинкса)
Я использую Сфинкс, чтобы вернуть хэш граней. Возвращенный хеш выглядит так:
{: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 ответов
Чтобы отсортировать хеш по ключам в 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
Я предполагаю, что в ожидаемом результате есть ошибка, она должна быть {: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]}
Если ваши хеши не слишком велики, и производительность на самом деле не является проблемой, вы все равно можете преобразовать свой хеш в массив, отсортировать массив и затем преобразовать его обратно в хеш (или OrderedHash, если вы используете ruby < 1.9), Это немного наивно, но, по крайней мере, вы можете двигаться дальше, сосредоточиться на чем-то другом и вернуться к этому позже, когда это станет проблемой.
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, чтобы это работало.
Спасибо всем, в конце концов я пошел с...
hash.map{ |key,values| [ key, values.sort_by {|x| x.to_s.sort} ] }
.to_s
был необходим, потому что определенные названия брендов / магазинов были пустыми строками и могли сортировать целые числа.