104 votes

Comment trier une liste dans Scala par deux champs?

comment trier une liste dans Scala par deux champs, dans cet exemple, je vais trier par nom et prénom?

 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'essaie des choses comme ça

 rows.sortBy(_.lastName + _.firstName)
 

mais ça ne marche pas. Je suis donc curieux de trouver une solution simple et efficace.

Merci d'avance!

Pongo

222voto

senia Points 22960
rows.sortBy(r => (r.lastName, r.firstName))

14voto

user unknown Points 15555
 rows.sortBy (row => row.lastName + row.firstName)
 

Si vous souhaitez trier les noms fusionnés, comme dans votre question, ou

 rows.sortBy (row => (row.lastName, row.firstName))
 

si vous voulez d'abord trier par nom, puis prénom; pertinent pour les noms plus longs (Wild, Wilder, Wilderman).

Si vous écrivez

 rows.sortBy(_.lastName + _.firstName)
 

avec 2 soulignements, la méthode attend deux paramètres:

 <console>:14: error: wrong number of parameters; expected = 1
       rows.sortBy (_.lastName + _.firstName)
                               ^
 

7voto

Marcin Points 25366

En général, si vous utilisez un algorithme de tri stable, vous pouvez simplement trier une clé, puis la suivante.

 rows.sortBy(_.firstName).sortBy(_.lastName)
 

Le résultat final sera trié par nom de famille, puis égal à, par prénom.

-3voto

user3508605 Points 17

Cela ne fonctionne peut-être que pour une liste de tuples, mais

 scala> var zz = List((1, 0.1), (2, 0.5), (3, 0.6), (4, 0.3), (5, 0.1))
zz: List[(Int, Double)] = List((1,0.1), (2,0.5), (3,0.6), (4,0.3), (5,0.1))

scala> zz.sortBy( x => (-x._2, x._1))
res54: List[(Int, Double)] = List((3,0.6), (2,0.5), (4,0.3), (1,0.1), (5,0.1))
 

semble fonctionner et être un moyen simple de l'exprimer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X