Wie sortiere ich eine Liste in Scala nach zwei Feldern? In diesem Beispiel sortiere ich nach Nachname und Vorname.
case class Row(var firstName: String, var lastName: String, var city: String)
var rows = List(new Row("Oscar", "Wilde", "London"),
new Row("Otto", "Swift", "Berlin"),
new Row("Carl", "Swift", "Paris"),
new Row("Hans", "Swift", "Dublin"),
new Row("Hugo", "Swift", "Sligo"))
rows.sortBy(_.lastName)
Ich versuche solche Dinge
rows.sortBy(_.lastName + _.firstName)
aber es funktioniert nicht. Ich bin also neugierig auf eine gute und einfache Lösung.
scala
sorting
functional-programming
Twistleton
quelle
quelle
Ordering
fürRow
Klasse und verwenden Sie es mitsorted
Methode wie folgt:rows.sorted(customOrdering)
. Sie können auch benutzerdefinierteOrdering
fürTuple2
Folgendes verwenden :rows.sortBy(r => (r.lastName, r.firstName))( Ordering.Tuple2(Ordering.String.reverse, Ordering.String) )
.customOrdering
alsOrdering[Row]
manuell oderOrdering.by
wie folgt aus :val customOrdering =
Ordering.by ((r: Row) => (r.lastName, r.firstName)) (Ordering.Tuple2 (Ordering.String.reverse, Ordering.String)) `rows.sortBy(r => (-r.field1, -r.field2))
-
mitString
. Sie solltenOrdering::reverse
diesen Weg verwenden :rows.sortBy(r => (r.lastName, r.firstName))(implicitly[Ordering[(String, String)]].reverse)
.Wenn Sie nach den zusammengeführten Namen sortieren möchten, wie in Ihrer Frage, oder
Wenn Sie zuerst nach Nachname sortieren möchten, dann Vorname. relevant für längere Namen (Wild, Wilder, Wilderman).
Wenn du schreibst
Mit 2 Unterstreichungen erwartet die Methode zwei Parameter:
quelle
Wenn Sie einen stabilen Sortieralgorithmus verwenden, können Sie im Allgemeinen nur nach einem Schlüssel und dann nach dem nächsten sortieren.
Das Endergebnis wird nach Nachname und dann, wo dies gleich ist, nach Vorname sortiert.
quelle
sortBy
eine stabile Sorte verwendet? Ansonsten ist diese Antwort bedeutungslos.rows
ist eine unveränderliche Liste undsortBy
gibt einen neuen Wert zurück, anstatt den Wert zu ändern, auf dem sie funktioniert (auch in veränderlichen Klassen). Ihr zweiter Ausdruck sortiert also nur die ursprüngliche unsortierte Liste.Vielleicht funktioniert das nur für eine Liste von Tupeln, aber
scheint zu funktionieren und eine einfache Möglichkeit zu sein, es auszudrücken.
quelle