web-dev-qa-db-fra.com

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.

88
Twistleton
rows.sortBy(r => (r.lastName, r.firstName))
198
senia
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)
                               ^
11
user unknown

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.

6
Marcin