2013-06-26 3 views
2

У меня есть массив хэшей, который должен быть довольно простым в сортировке, но так как я очень новичок в рубине и все еще смотрю в документы, у меня возникают проблемы для сортировки хеша, у которого мало комбинации ключевых значений, но их нужно сортировать на основе нескольких ключевых значений.Сортировка хэша с пользовательским компаратором в ruby ​​

[{:attr1 => 3, :attr2 => 'test', attr3 => 'test2'}, 
{:attr1 => 1, :attr2 => 'test', attr3 => nil}, 
{:attr1 => 1, :attr2 => 'test', attr3 => 'test3'}, 
{:attr1 => 2, :attr2 => 'test', attr3 => 'test3'}] 

Поэтому я хотел бы отсортировать его в соответствии с пользовательским правилом. И пользовательское правило будет сначала взглянуть на attr1 и отсортировать по нему в порядке убывания.

Если есть такие же значения attr1, но один из них attr3 равен nil, тогда заказывайте те, у кого последний.

Поэтому я думаю, что мне нужно будет создать собственный компаратор, или нет. Как я могу сделать это с наименьшим количеством боли?

Если это должно было быть отсортирован это будет выглядеть следующим образом:

[{:attr1 => 3, :attr2 => 'test', attr3 => 'test2'}, 
    {:attr1 => 2, :attr2 => 'test', attr3 => 'test3'}, 
    {:attr1 => 1, :attr2 => 'test', attr3 => 'test3'}, 
    {:attr1 => 1, :attr2 => 'test', attr3 => nil} 
] 
+0

Что такое 'attr3'? Перед использованием вы должны определить локальные переменные или методы. – sawa

ответ

2

Самый простой способ разделить на последнем поле и сортировки самостоятельно (при условии, что вам нужно значения с последнего атрибута ноль отсортирован тоже):

array.partition{|h| !h[:attr3].nil?}.map{|ar| ar.sort_by{|h| -h[:attr1]}}.flatten 
5
array.sort_by{|h| [-h[:attr1], h[:attr3].nil?? 1 : 0]}