15

2 つのプロパティを評価してオブジェクト配列を並べ替えるカスタム ブロック メソッドを指定したいと考えています。しかし、何度も検索した結果、<=>演算子のない例は見つかりませんでした。

a比較したい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

これは私のコードであり、動作しません:

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

このブロックは関数内にあり、関数returnを終了して戻り-1ます。

4

3 に答える 3

33

xこれにより、 then の昇順が得られますy

points.sort_by{ |p| [p.x, p.y] }
于 2013-03-14T05:28:18.553 に答える
22

最良の回答は、以下の @AJcodez によって提供されます。

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

私が最初に提供した「正しい」答えは、技術的には機能しますが、書くことをお勧めするコードではありません。私は、Ruby がより表現力豊かで簡潔な方法を持っているかどうかを考えたり調査したりするのをやめるのではなく、質問のif/の使用法に合うように回答を作成したことを思い出します。else


caseステートメントで:

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 

三項の場合:

ar.sort { |a,b| a.x < b.x ? -1 : (a.x > b.x ? 1 : (a.y <=> b.y)) }
于 2013-03-14T04:23:10.200 に答える