Как отсортировать не простой хеш (hash of hashes) - PullRequest
5 голосов
/ 12 декабря 2008

У меня есть такой хэш

{ 55 => {:value=>61, :rating=>-147},
  89 => {:value=>72, :rating=>-175},
  78 => {:value=>64, :rating=>-155},
  84 => {:value=>90, :rating=>-220},
  95 => {:value=>39, :rating=>-92},
  46 => {:value=>97, :rating=>-237},
  52 => {:value=>73, :rating=>-177},
  64 => {:value=>69, :rating=>-167},
  86 => {:value=>68, :rating=>-165},
  53 => {:value=>20, :rating=>-45}
}

Как мне отсортировать по : рейтинг ? Или, может быть, я должен использовать другую структуру?

Ответы [ 3 ]

6 голосов
/ 13 декабря 2008

Я бы изменил структуру данных на массив хэшей:

my_array =
[
  {:id => 78, :value=>64, :rating=>-155},
  {:id => 84, :value=>90, :rating=>-220},
  {:id => 95, :value=>39, :rating=>-92}
]

Вы можете легко отсортировать такую ​​структуру с помощью

my_array.sort_by { |record| record[:rating] }

Чтобы получить хеш-подобную функцию извлечения записи по id, вы можете определить новый метод для my_array:

def my_array.find_by_id(id) 
  self.find { |hash| hash[:id] == id }
end

так что после этого вы можете сделать

my_array.find_by_id(id)

вместо

my_hash[id]
5 голосов
/ 12 декабря 2008

Хэши в Ruby не могут быть отсортированы (по крайней мере, до 1.9)

Это означает, что цикл через Hash не обязательно даст информацию в правильном порядке для вас. Тем не менее, легко зацикливать хешированные данные в определенном порядке, сначала преобразовав их в массив, и фактически вызов методов сортировки в хэше преобразует их в массив для вас:

>> { :a => 4, :b => 12, :c => 3, :d => 8 }.sort_by { |key, value| value }
=> [[:c, 3], [:a, 4], [:d, 8], [:b, 12]]

Так в вашем случае:

hsh.sort_by {|key, ratings| ratings[:rating] }
3 голосов
/ 12 декабря 2008

Возможно, существует лучшая структура данных, но (я предполагаю, что это ruby), это можно сделать в Ruby, используя встроенный стиль сортировки, чтобы в основном рассказать, как сравнивать их. Вот конкретный пример:

my_hash = { 
  55 => {:value=>61, :rating=>-147},
  89 => {:value=>72, :rating=>-175},
  78 => {:value=>64, :rating=>-155},
  84 => {:value=>90, :rating=>-220},
  95 => {:value=>39, :rating=>-92},
  46 => {:value=>97, :rating=>-237},
  52 => {:value=>73, :rating=>-177},
  64 => {:value=>69, :rating=>-167},
  86 => {:value=>68, :rating=>-165},
  53 => {:value=>20, :rating=>-45}
}

puts "MY HASH"
my_hash.each do |local|
  puts local
end

sorted_hash = my_hash.sort  { | leftval, rightval | rightval[1][:rating]<=>leftval[1][:rating] }

puts "SORTED HASH"
sorted_hash.each do |local|
  puts local
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...