2013-06-26 79 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值,但其中attr3nil,那麼可以將其排在最後一位。

所以我想我需要創建自定義比較器,或不。我怎樣才能以最少的痛苦做到這一點?

如果這是進行排序會是這樣的:

[{: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]}