Comment sortinger une liste dans Scala par deux champs?

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

case class Row(var firstName: Ssortingng, var lastName: Ssortingng, var city: Ssortingng) 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 facile et efficace.

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

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

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

Si vous voulez d’abord sortinger par lastName, alors firstName; pertinent pour les noms plus longs (Wild, Wilder, Wilderman).

Si vous écrivez

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

avec 2 soulignés, la méthode attend deux parameters:

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

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

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

Le résultat final sera sortingé par nom, puis où cela est égal, par prénom.

Peut-être que cela ne fonctionne 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.