Was ist der beste Weg, um eine umgekehrte Sortierung in Scala durchzuführen? Ich stelle mir vor, dass das Folgende etwas langsam ist.
list.sortBy(_.size).reverse
Gibt es eine bequeme Möglichkeit, sortBy zu verwenden, aber eine umgekehrte Sortierung zu erhalten? Ich würde es lieber nicht brauchen sortWith
.
Antworten:
Es kann naheliegend sein, das Vorzeichen zu ändern, wenn Sie nach einem numerischen Wert sortieren
Im Allgemeinen kann die Sortierung nach einer Methode erfolgen, die mit einer impliziten Reihenfolge sortiert ist, die Sie explizit festlegen können, und die Reihenfolge hat eine umgekehrte Reihenfolge (nicht die umgekehrte Liste unten)
Wenn die Reihenfolge, die Sie umkehren möchten, die implizite Reihenfolge ist, können Sie sie implizit [Bestellung [A]] (A der Typ, für den Sie bestellen) oder besser Bestellung [A] erhalten. Das wäre
sortBy ist wie die Verwendung von Ordering.by, also können Sie es tun
Vielleicht nicht das kürzeste zu schreiben (im Vergleich zu Minus), aber die Absicht ist klar
Aktualisieren
Die letzte Zeile funktioniert nicht. Um das
_
In zu akzeptierenOrdering.by(_.size)
, muss der Compiler wissen, für welchen Typ wir bestellen, damit er das eingeben kann_
. Es mag scheinen, dass dies der Typ des Elements der Liste ist, aber dies ist nicht so, wie die Signatur von sortiert istdef sorted[B >: A](ordering: Ordering[B])
. Die Reihenfolge kann aktiviert seinA
, aber auch für jeden Vorfahren vonA
(den Sie möglicherweise verwendenbyHashCode : Ordering[Any] = Ordering.by(_.hashCode)
). Und tatsächlich erzwingt die Tatsache, dass die Liste kovariant ist, diese Signatur. Man kann es tunaber das ist viel weniger angenehm.
quelle
list.sortBy(x => (-x.size, x.forTiesUseThisField))
list.sorted(Ordering.by((_: TheType).size).reverse)
betrachtetlist.sorted(Ordering.by[TheType, Int](_.size).reverse)
es klarer (aber länger) für meinen Punkt veiw.list.sortBy(_.size)(Ordering[Int].reverse)
auch.quelle
vielleicht um es ein bisschen mehr zu verkürzen:
quelle
Einfach peasy (zumindest bei
size
):quelle
sortBy
hat einen impliziten Parameter,ord
der die Reihenfolge bereitstelltSo können wir ein eigenes
Ordering
Objekt definierenquelle
Beide
sortWith
undsortBy
haben eine kompakte Syntax:Ich finde den mit
sortWith
leichter zu verstehen.quelle
quelle
Eine weitere Möglichkeit in Fällen, in denen Sie eine Funktion übergeben, die Sie möglicherweise nicht direkt über sortWith in einen Arraybuffer ändern können, zum Beispiel:
quelle
das ist mein code;)
quelle