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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top