Sortieren Sie Objekte nach Booleschen Werten in Ruby
-
05-09-2019 - |
Frage
Ich entschuldige mich, wenn dies zuvor beantwortet wurde oder offensichtlich ist ... habe hier und auf dem Goog einige gesucht und konnte keine Antwort gefunden.
Ich möchte eine Reihe von Anbietern nach Preis sortieren und ob sie ein bevorzugter_Provider sind? (richtig oder falsch)
Zum Beispiel in 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
Ich möchte p.sort_by und bekommen:
[p2 p3 p1]
IAW
p.sort_by {|x| x.preferred_provider?, x.price }
funktioniert nicht und bekommt ...
undefined method `<=>' for false:FalseClass
Irgendwelche Vorschläge zu besseren Möglichkeiten, um dieses Problem zu erreichen?
Lösung
Die meisten Sprachen bieten Sortierfunktionen, die akzeptieren Komparatoren für so etwas. In Ruby ist dies nur 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
}
Andere Tipps
Sie könnten a definieren <=>
auf der Provider
Klasse, um das zu tun, was Sie wollen, und dann mit dem sortieren Array.sort
Methode (eher als Enumerable.sort_by
). Hier ist eine Definition von <=>
Dass ich gepeitscht habe:
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
Dann, wenn Sie Ihr Array haben p
, du könntest einfach tun p_sorted = p.sort
.
(Beachten Sie, dass ich diesen Code nicht getestet habe, daher kann es einige Fehler geben, aber ich denke, er dient dazu, die Idee zu demonstrieren.)