Meine persönliche Lieblingsmethode besteht darin, die bereitgestellte implizite Reihenfolge für Tupel zu verwenden, da diese klar, präzise und korrekt ist:
case class A(tag: String, load: Int) extends Ordered[A] {
// Required as of Scala 2.11 for reasons unknown - the companion to Ordered
// should already be in implicit scope
import scala.math.Ordered.orderingToOrdered
def compare(that: A): Int = (this.tag, this.load) compare (that.tag, that.load)
}
Das funktioniert , weil der BegleiterOrdered
definiert eine implizite Konvertierung von Ordering[T]
zu Ordered[T]
denen in Rahmen für jede Klasse ist die Umsetzung Ordered
. Das Vorhandensein von impliziten Ordering
s für Tuple
s ermöglicht eine Konvertierung von TupleN[...]
zu, Ordered[TupleN[...]]
sofern Ordering[TN]
für alle Elemente T1, ..., TN
des Tupels ein implizites s vorhanden ist. Dies sollte immer der Fall sein, da es keinen Sinn macht, nach einem Datentyp mit no zu sortieren Ordering
.
Die implizite Reihenfolge für Tupel ist Ihre Anlaufstelle für jedes Sortierszenario mit einem zusammengesetzten Sortierschlüssel:
as.sortBy(a => (a.tag, a.load))
Da sich diese Antwort als beliebt erwiesen hat, möchte ich darauf eingehen und darauf hinweisen, dass eine Lösung, die der folgenden ähnelt, unter bestimmten Umständen als Enterprise-Grade ™ angesehen werden kann:
case class Employee(id: Int, firstName: String, lastName: String)
object Employee {
// Note that because `Ordering[A]` is not contravariant, the declaration
// must be type-parametrized in the event that you want the implicit
// ordering to apply to subclasses of `Employee`.
implicit def orderingByName[A <: Employee]: Ordering[A] =
Ordering.by(e => (e.lastName, e.firstName))
val orderingById: Ordering[Employee] = Ordering.by(e => e.id)
}
Gegeben es: SeqLike[Employee]
, es.sorted()
wird nach Namen und es.sorted(Employee.orderingById)
nach ID sortiert. Dies hat einige Vorteile:
- Die Sortierungen werden an einer einzelnen Stelle als sichtbare Code-Artefakte definiert. Dies ist nützlich, wenn Sie in vielen Feldern komplexe Sortierungen haben.
- Die meisten in der Scala-Bibliothek implementierten Sortierfunktionen werden mit Instanzen von ausgeführt
Ordering
. Wenn Sie also eine Bestellung direkt bereitstellen, wird in den meisten Fällen eine implizite Konvertierung vermieden.