Сортировать хэш по ключу в обратном порядке, вернуть хэш в Ruby - PullRequest
2 голосов
/ 04 ноября 2011

Можете ли вы помочь кому-нибудь ?.У меня есть значение хеш-функции следующим образом.Мне нужно отсортировать хэш в обратном порядке по значению ключа и вернуть как тип хэша.

Мой фактический ожидаемый результат (хэш)

result = {20111104111221=>[4, 5, 6], 20111104111220=>[7, 8, 9], 20111104110950=>[1, 2, 3]}
# this is my input
irb(main):096:0> h = {20111104111221=>[4, 5, 6], 20111104110950=>[1, 2, 3], 20111104111220=>[7, 8, 9]} 
=> {20111104111221=>[4, 5, 6], 20111104110950=>[1, 2, 3], 20111104111220=>[7, 8, 9]}

# It's not correct
irb(main):095:0> Hash[h.sort]
=> {20111104111221=>[4, 5, 6], 20111104110950=>[1, 2, 3], 20111104111220=>[7, 8, 9]}

Итак, я попробовал это.Это правильно, но оно возвращается в виде значения массива, мне нужно возвращаемое значение в виде хэша.

# It's correct but it's not a hash
irb(main):092:0> arr = h.sort_by { |k,v| k }.reverse
=> [[20111104111221, [4, 5, 6]], [20111104111220, [7, 8, 9]], [20111104110950, [1, 2, 3]]]

Снова я попытался преобразовать массив в хэш ... но это помогает.

Ответы [ 2 ]

8 голосов
/ 04 ноября 2011

Вы почти там с h.sort_by..., не сглаживайте, просто подайте его на Hash[]:

Hash[h.sort_by { |k,v| -k }]

Я также упростил вашу сортировку, отрицая число делает то же самое, что сортировка и реверсирование.

Например:

>> h = {20111104111221=>[4, 5, 6], 20111104110950=>[1, 2, 3], 20111104111220=>[7, 8, 9]}
=> {20111104111221=>[4, 5, 6], 20111104110950=>[1, 2, 3], 20111104111220=>[7, 8, 9]}
>> Hash[h.sort_by { |k,v| -k }]
=> {20111104111221=>[4, 5, 6], 20111104111220=>[7, 8, 9], 20111104110950=>[1, 2, 3]}
3 голосов
/ 04 ноября 2011

Какую версию ruby ​​вы используете? В 1.8 хэши не могут быть заказаны, в 1.9 они упорядочены на основе вставки. Вот больше информации об этом .

Учитывая различия в том, как они обрабатываются, я бы сосредоточился не на самой сортировке хеша, а на сортировке ваших ключей и использовании их в качестве ссылки, например:

data = {20111104111221=>[4, 5, 6], 20111104111220=>[7, 8, 9], 20111104110950=>[1, 2, 3]}

keys = data.keys.sort.reverse
keys.each do |key|
  puts data[key].pretty_inspect
  # ... do work ...
end

Там есть строка отладки, как пример того, как получить доступ к вашим значениям. Надеюсь, это поможет!

...