как отсортировать список в 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)
но это не работает. Так что мне было бы любопытно найти хорошее и простое решение.
scala
sorting
functional-programming
Твистлтон
источник
источник
Ordering
дляRow
класса и использовать его сsorted
методом , как это:rows.sorted(customOrdering)
. Вы можете также использовать пользовательскиеOrdering
дляTuple2
так:rows.sortBy(r => (r.lastName, r.firstName))( Ordering.Tuple2(Ordering.String.reverse, Ordering.String) )
.customOrdering
какOrdering[Row]
вручную, так и с помощьюOrdering.by
следующего:val customOrdering =
Ordering.by ((r: Row) => (r.lastName, r.firstName)) (Ordering.Tuple2 (Ordering.String.reverse, Ordering.String)) `rows.sortBy(r => (-r.field1, -r.field2))
-
сString
. Вы должны использоватьOrdering::reverse
этот путь:rows.sortBy(r => (r.lastName, r.firstName))(implicitly[Ordering[(String, String)]].reverse)
.Если вы хотите отсортировать по объединенным именам, как в вашем вопросе, или
если вы сначала хотите отсортировать по lastName, то firstName; актуально для более длинных имен (Wild, Wilder, Wilderman).
Если вы напишете
с двумя подчеркиваниями метод ожидает два параметра:
источник
В общем, если вы используете стабильный алгоритм сортировки, вы можете просто сортировать по одному ключу, а затем по следующему.
Окончательный результат будет отсортирован по фамилии, а затем, если они совпадают, по имени.
источник
sortBy
используется стабильная сортировка? В противном случае этот ответ не имеет смысла.rows
является неизменяемым списком иsortBy
возвращает новое значение, а не изменяет то, над чем он работает (даже в изменяемых классах). Итак, ваше второе выражение просто сортирует исходный несортированный список.Возможно, это работает только для списка кортежей, но
кажется, работает и является простым способом выразить это.
источник