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?

¿Fue útil?

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.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top