2011-01-07 7 views
1

このような項目を並べ替えるにはより良い(同等の)方法がありますか?Ruby:次の「並べ替え」メソッドを記述するより良い方法はありますか?

items.sort! do |p1, p2| 
    if (p1.foo == p2.foo) 
    if (p1.bar == p2.bar) 
     if (p1.moo == p2.moo) 
     p1.wow <=> p2.wow    # Ascending order 
     else 
     p2.sam.moo <=> p1.sam.moo  # Descending order, 2 levels attribute 
     end 
    else 
     p2.bar <=> p1.bar     # Descending order 
    end 
    else 
    p1.foo <=> p2.foo     # Ascending order 
    end 
end 

答えて

3

あなたは

[p1.foo, p1.bar, p1.moo, p1.sam.moo] <=> [p2.foo, p2.bar, p2.moo, p2.sam.moo] 

配列を文字列だけのように比較され、比較のための配列内のオブジェクトを有効にすることができます:最初の異なる要素によって。

いくつかの比較で逆インデックス(p2.bar <=> p1.bar)が誤字でない場合は、配列要素も切り替える必要があります。

それとも、この場合は、あなたのクラス

def <=>(p2) 
    ... 
    end 

で比較演算子をオーバーライドすることができ、あなたはitems.sort!に何かを渡す必要はありません。

+0

これは本当に素晴らしいです!どうもありがとう! –

+1

少し重複しないように、 'items.sort_by! {| p | [p.foo、p.bar、p.moo、p.sam.moo]} 'もしそれらがすべて昇順であれば。 –

+1

@Ben Alpert:そうでない場合は数字ですが、あなたは 'sort_by! {| p | [p.foo、-p.bar、-p.moo]} ' –

関連する問題