comment trier une liste dans Scala par deux champs, dans cet exemple je vais trier par lastName et firstName?
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)
J'essaye des trucs comme ça
rows.sortBy(_.lastName + _.firstName)
mais ça ne marche pas. Je suis donc curieux de trouver une solution simple et efficace.
scala
sorting
functional-programming
Twistleton
la source
la source
Ordering
pour laRow
classe et l' utiliser avecsorted
méthode comme ceci:rows.sorted(customOrdering)
. Vous pouvez également utiliser la coutumeOrdering
pourTuple2
comme ceci:rows.sortBy(r => (r.lastName, r.firstName))( Ordering.Tuple2(Ordering.String.reverse, Ordering.String) )
.customOrdering
commeOrdering[Row]
manuellement ou en utilisantOrdering.by
comme ceci:val customOrdering =
Ordering.by ((r: Row) => (r.lastName, r.firstName)) (Ordering.Tuple2 (Ordering.String.reverse, Ordering.String)) `rows.sortBy(r => (-r.field1, -r.field2))
-
avecString
. Vous devez utiliserOrdering::reverse
cette façon:rows.sortBy(r => (r.lastName, r.firstName))(implicitly[Ordering[(String, String)]].reverse)
.Si vous souhaitez trier par les noms fusionnés, comme dans votre question, ou
si vous voulez d'abord trier par lastName, alors firstName; pertinent pour les noms plus longs (Wild, Wilder, Wilderman).
Si vous écrivez
avec 2 soulignements, la méthode attend deux paramètres:
la source
En général, si vous utilisez un algorithme de tri stable, vous pouvez simplement trier par une clé, puis par la suivante.
Le résultat final sera trié par nom de famille, puis là où c'est égal, par prénom.
la source
sortBy
utilise un tri stable? Sinon, cette réponse n'a pas de sens.rows
est une liste immuable etsortBy
renvoie une nouvelle valeur plutôt que de muter celle sur laquelle elle fonctionne (même dans les classes mutables). Donc, votre deuxième expression ne fait que trier la liste d'origine non triée.Peut-être que cela ne fonctionne que pour une liste de tuples, mais
semble fonctionner et être un moyen simple de l'exprimer.
la source