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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top