3

これが以前に回答されている場合、または明らかである場合は申し訳ありません...こことGoogで検索を行いましたが、回答が見つかりませんでした。

プロバイダーの配列を価格でソートし、それらがpreferred_providerであるかどうかを調べていますか? (正しいか間違っているか)

たとえば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

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

4

2 に答える 2

8

ほとんどの言語には、この種のコンパレータを受け入れるソート関数が用意されています。Ruby では、これは単なる array.sort です。

p.sort {|a, b| if (a.preferred_provider? == b.preferred_provider?
               then a.price <=> b.price
               elsif a.preferred_provider?
                    1
               else -1
       }
于 2009-05-24T15:03:07.707 に答える
3

クラスで を定義し<=>て、必要なことを行い、メソッドを使用して並べ替えることができます ( ではなく)。私が思いついた定義は次のとおりです。ProviderArray.sortEnumerable.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

(私はこのコードをテストしていないことに注意してください。そのため、いくつかのエラーがあるかもしれませんが、アイデアを示すのに役立つと思います。)

于 2009-05-24T15:03:06.240 に答える