Подтвердить что ты не робот

Как отсортировать список в Scala двумя полями?

как отсортировать список в Scala двумя полями, в этом примере я буду сортировать по lastName и 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)

Я пробую вещи вроде этого

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

но это не сработает. Поэтому мне интересно, какое хорошее и простое решение.

4b9b3361

Ответ 1

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

Ответ 2

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

Если вы хотите сортировать по объединенным именам, как в своем вопросе, или

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

если вы сначала хотите сортировать по lastName, затем firstName; подходит для более длинных имен (Wild, Wilder, Wilderman).

Если вы пишете

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

с двумя подчеркиваниями, метод ожидает два параметра:

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

Ответ 3

В общем случае, если вы используете стабильный алгоритм сортировки, вы можете просто отсортировать его по одному ключу, затем следующему.

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

Окончательный результат будет отсортирован по имени, тогда, где это будет равно, по первому.

Ответ 4

Возможно, это работает только для списка кортежей, но

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))

похоже, работает и может быть простым способом выразить его.