¿Cómo ordenar una lista en Scala por dos campos, en este ejemplo ordenaré por apellido y nombre?
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)
Intento cosas como esta
rows.sortBy(_.lastName + _.firstName)
pero no funciona. Así que tengo curiosidad por una solución buena y fácil.
scala
sorting
functional-programming
Twistleton
fuente
fuente
Ordering
para laRow
clase y lo uso consorted
método como este:rows.sorted(customOrdering)
. También es posible usar la costumbreOrdering
deTuple2
la siguiente manera:rows.sortBy(r => (r.lastName, r.firstName))( Ordering.Tuple2(Ordering.String.reverse, Ordering.String) )
.customOrdering
comoOrdering[Row]
manual o utilizandoOrdering.by
la siguiente manera:val customOrdering =
Ordering.by ((r: Fila) => (r.lastName, r.firstName)) (Ordering.Tuple2 (Ordering.String.reverse, Ordering.String)) `rows.sortBy(r => (-r.field1, -r.field2))
-
conString
. Debe utilizarOrdering::reverse
la siguiente manera:rows.sortBy(r => (r.lastName, r.firstName))(implicitly[Ordering[(String, String)]].reverse)
.Si desea ordenar por los nombres combinados, como en su pregunta, o
si primero desea ordenar por apellido, luego nombre; relevante para nombres más largos (Wild, Wilder, Wilderman).
Si tú escribes
con 2 subrayados, el método espera dos parámetros:
fuente
En general, si usa un algoritmo de clasificación estable, puede ordenar por una clave y luego por la siguiente.
El resultado final se ordenará por apellido, luego, donde sea igual, por nombre.
fuente
sortBy
usa una ordenación estable? De lo contrario, esta respuesta no tiene sentido.rows
es una lista inmutable ysortBy
devuelve un nuevo valor en lugar de mutar aquello sobre lo que funciona (incluso en clases mutables). Entonces, su segunda expresión es simplemente ordenar la lista original sin clasificar.Quizás esto funcione solo para una lista de tuplas, pero
parece funcionar y ser una forma sencilla de expresarlo.
fuente