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 Orderings für Tuples ermöglicht eine Konvertierung von TupleN[...]zu, Ordered[TupleN[...]]sofern Ordering[TN]für alle Elemente T1, ..., TNdes 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.