質問

これが以前に回答されたか、明らかな場合は謝罪します...こことGOOGで検索して、答えを見つけることができませんでした。

プロバイダーの配列を価格で並べ替えたいと思っています。 (正しいか間違っているか)

たとえばで array p of Providers...

p1.price == 1, p1.preferred_provider? == false
p2.price == 2, p2.preferred_provider? == true
p2.price == 3, p3.preferred_provider? == true

p.sort_byと取得したい:

[p2 p3 p1]

iaw

p.sort_by {|x| x.preferred_provider?, x.price }

動作せず、取得します...

undefined method `<=>' for false:FalseClass

この問題にアプローチするより良い方法に関する提案はありますか?

役に立ちましたか?

解決

ほとんどの言語は、受け入れるソート関数を提供します コンパレータ この種のために。 Rubyでは、これは単なる配列です。ソート:

p.sort {|a, b| if (a.preferred_provider? == b.preferred_provider?
               then a.price <=> b.price
               elsif a.preferred_provider?
                    1
               else -1
       }

他のヒント

aを定義できます <=>Provider あなたが望むことをするためにクラス、そして Array.sort メソッド(ではなく Enumerable.sort_by)。これが定義です <=> 私がホイップしたこと:

class Provider
  def <=>(other)
    if preferred_provider?
      if other.preferred_provider?
        @price <=> other.price
      else
        1
      end
    else
      if other.preferred_provider?
        -1
      else
        @price <=> other.price
      end
    end
  end
end

次に、配列がある場合 p, 、あなたはただすることができます p_sorted = p.sort.

(このコードをテストしていないので、いくつかのエラーがあるかもしれませんが、アイデアを実証するのに役立つと思います。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top