2013-11-18 4 views
-1

Я пытаюсь реорганизовать хэш, так что конкретный ключ находится в начале, а другой ключ находится в конце. Например:Ruby реорганизация хэша

x = {:a => 123, :b => 456, :c => 789, :d => 123} 
# returns => {:a=>123, :b=>456, :c=>789, :d=>123} 
x.sort.reverse! 
# returns => [[:d, 123], [:c, 789], [:b, 456], [:a, 123]] 

Как я могу начать хеш с помощью c и заканчивать b после сортировки?

EDIT: Мне нужно заказать хэш из-за того, когда я «x.each | ключ, объект | делать ...» Мне нужно хэш, чтобы начать с конкретным ключом

+2

Хеши в Ruby не подлежат заказу, Массивы. – MrYoshiji

+3

@Rob Не волнуйтесь за верхние два комментария, так как они ошибаются. – sawa

+0

Мне нужно заказать хеш из-за того, когда я делаю «x.each | key, object | do ...» Мне нужно, чтобы это было в определенном порядке – Rob

ответ

2

Не полагайтесь на хэш-код. Получить ключи, заказать их, и петля хэш:

keys = x.keys 
#sort how you need it 
keys.each do |key| 
    object = x[key] 
    #do what you want 
end 
+0

Это, казалось, лучше всего срабатывало при меньшем количестве осложнений – Rob

2
x = {:a => 123, :b => 456, :c => 789, :d => 123} 

c, b = x.delete(:c), x.delete(:b) 
Hash[[[:c, c], *x.sort.reverse, [:b, b]]] 
# => {:c => 789, :d => 123, :a => 123, :b => 456} 

или

c, b = x.delete(:c), x.delete(:b) 
Hash[:c, c, *x.sort.reverse.flatten, :b, b] 
# => {:c => 789, :d => 123, :a => 123, :b => 456} 
+1

Отличный ответ, но вызванный осложнениями в реальном мире (это довольно сложно, чем то, что было опубликовано выше). Спасибо! – Rob

+1

Совсем не кажется сложным. Читает как книга. –

-2

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

x = {c: 1, d: 2, a: 3, b: 4} 

x.sort.reverse 
#=> [[:d, 2], [:c, 1], [:b, 4], [:a, 3]] 

Hash[x.sort.reverse] 
#=> {:d=>2, :c=>1, :b=>4, :a=>3} 
Смежные вопросы