ルビーのブール値でオブジェクトをソートします
-
05-09-2019 - |
質問
これが以前に回答されたか、明らかな場合は謝罪します...ここと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
.
(このコードをテストしていないので、いくつかのエラーがあるかもしれませんが、アイデアを実証するのに役立つと思います。)
所属していません StackOverflow