2013-03-14 10 views
10

ruby​​でオブジェクト配列をソートするカスタムブロックメソッドを指定したい場合、2つのプロパティを評価します。しかし、Googleでの多くの検索の後、私は< =>演算子なしではどの例にも着くことができませんでした。ruby​​でのカスタムソートメソッド

これは私が何をしたいです: は、B対比較:

if a.x less than b.x return -1 
if a.x greater than b.x return 1 
if a.x equals b.x, then compare by another property , like a.y vs b.y 

これは私のコード(ルビーでnoobの、申し訳ありません)であり、それは仕事をdoesntの...

ar.sort! do |a,b| 
    if a.x < b.y return -1 
    elseif a.x > b.x return 1 
    else return a.y <=> b.y 
end 

このブロックは関数内にあり、戻り値は関数から出て-1を返すようになっています。私はこれに関する助けに感謝します。

大切にしてください。三元で

ar.sort do |a, b| 
    case 
    when a.x < b.x 
    -1 
    when a.x > b.x 
    1 
    else 
    a.y <=> b.y 
    end 
end 

:case文で

+0

なぜソート方法を使用していませんか? –

+0

@Gashner私はそれを使用していますが、私は評価をカスタマイズするつもりです。 – alexserver

+0

なぜ「<=>」は除外されていますか?あなたはそれを難し​​い方法でやりたいのですから? –

答えて

13

ar.sort { |a,b| a.x < b.x ? -1 : (a.x > b.x ? 1 : (a.y <=> b.y)) } 
+0

ありがとう、これは働いた! – alexserver

+5

ルビの多レベルの3値ステートメントは、可読性/保守上の理由から推奨されていません。 –

23

これは、あなたがyについて、次にxの昇順与える:

points.sort_by{ |p| [p.x, p.y] } 
+0

+1と '配列#<=>'は、正確にセマンティクスOPが望みます。 – dbenhur

+0

これはとてもエレガントです!よくできた - 受け入れられた答え、IMHOでなければなりません – Sebastian

0

をこれは動作するようです:

# Ascending 
ar.sort! do |a,b| 
    (a-b).abs() > 0 ? a-b : 0 
end 

# Descending 
ar.sort! do |a,b| 
    (a-b).abs() > 0 ? b-a : 0 
end 

ルビは0を真と見なしているので、宇宙船オペレータ(<=>)の必要はありません。(これは構文効率の点で)余計なようです。三項演算子の明示的な0です。

関連する問題