Clasificar objetos por valores booleanos en Ruby
-
05-09-2019 - |
Pregunta
Mis disculpas si esto ha sido respondida antes o es obvio ... hizo algunas búsquedas aquí y en el Goog y no podía encontrar una respuesta.
Busco para ordenar una serie de proveedores por precio y si son un preferred_provider? (Verdadero o falso)
Por ejemplo, en 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
Me gustaría p.sort_by y obtener:
[p2 p3 p1]
IAW
p.sort_by {|x| x.preferred_provider?, x.price }
no funciona y obtiene ...
undefined method `<=>' for false:FalseClass
¿Alguna sugerencia sobre mejores maneras de abordar este problema?
Solución
La mayoría de los lenguajes proporcionan funciones de clasificación que aceptan comparadores para este tipo de cosas. En Ruby, esto es sólo 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
}
Otros consejos
Se puede definir un <=>
en la clase Provider
a hacer lo que quiera, y luego una especie utilizando el método Array.sort
(en lugar de Enumerable.sort_by
). He aquí una definición de <=>
que Instigó:
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
Entonces, si usted tiene la matriz p
, sólo podía hacer p_sorted = p.sort
.
(Tenga en cuenta que no he probado este código, por lo que puede haber algunos errores, pero creo que sirve para demostrar la idea.)