Ordinare gli oggetti di valori booleani in Ruby
-
05-09-2019 - |
Domanda
Le mie scuse se questo è stato risposto prima o è ovvio ... fatto qualche ricerca qui e sul Goog e non riusciva a trovare una risposta.
Sto cercando di ordinare una serie di fornitori per prezzo e se sono un preferred_provider? (Vero o falso)
Per esempio 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
Vorrei p.sort_by e ottenere:
[p2 p3 p1]
IAW
p.sort_by {|x| x.preferred_provider?, x.price }
non funziona e ottiene ...
undefined method `<=>' for false:FalseClass
Tutti i suggerimenti su modi migliori per affrontare questo problema?
Soluzione
La maggior parte dei linguaggi forniscono funzioni di ordinamento che accettano comparatori per questo genere di cose. In Ruby, questa è solo 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
}
Altri suggerimenti
Si potrebbe definire un <=>
sulla classe Provider
di fare ciò che si vuole, e quindi ordinare con il metodo Array.sort
(piuttosto che Enumerable.sort_by
). Ecco una definizione di <=>
che ho scatenato:
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
Quindi, se avete il vostro p
array, si può solo fare p_sorted = p.sort
.
(Si noti che non ho ancora testato questo codice, così ci possono essere alcuni errori, ma penso che serve a dimostrare l'idea.)