jak posortować listę w Scali według dwóch pól, w tym przykładzie posortuję według lastName i 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)
Próbuję takich rzeczy
rows.sortBy(_.lastName + _.firstName)
ale to nie działa. Dlatego jestem ciekawa dobrego i łatwego rozwiązania.
scala
sorting
functional-programming
Twistleton
źródło
źródło
Ordering
dlaRow
klasy i używać go zsorted
metody takie jak to:rows.sorted(customOrdering)
. Można również użyć niestandardowegoOrdering
dlaTuple2
tak:rows.sortBy(r => (r.lastName, r.firstName))( Ordering.Tuple2(Ordering.String.reverse, Ordering.String) )
.customOrdering
jakoOrdering[Row]
ręcznie lub używając wOrdering.by
ten sposób:val customOrdering =
Ordering.by ((r: Row) => (r.lastName, r.firstName)) (Ordering.Tuple2 (Ordering.String.reverse, Ordering.String)) `rows.sortBy(r => (-r.field1, -r.field2))
-
zString
. Należy użyćOrdering::reverse
w następujący sposób:rows.sortBy(r => (r.lastName, r.firstName))(implicitly[Ordering[(String, String)]].reverse)
.Jeśli chcesz posortować według scalonych nazw, jak w pytaniu, lub
jeśli najpierw chcesz posortować według lastName, to firstName; istotne dla dłuższych nazw (Wild, Wilder, Wilderman).
Jeśli piszesz
z 2 podkreśleniami metoda oczekuje dwóch parametrów:
źródło
Ogólnie rzecz biorąc, jeśli używasz stabilnego algorytmu sortowania, możesz po prostu sortować według jednego klucza, a następnie następnego.
Ostateczny wynik zostanie posortowany według nazwiska, a jeśli jest równe, według imienia.
źródło
sortBy
używa stabilnego sortowania? W przeciwnym razie ta odpowiedź jest bez znaczenia.rows
jest niezmienną listą isortBy
zwraca nową wartość zamiast modyfikować tę, na której działa (nawet w klasach mutowalnych). Twoje drugie wyrażenie to po prostu sortowanie oryginalnej listy nieposortowanej.Być może działa to tylko w przypadku listy krotek, ale
wydaje się działać i być prostym sposobem wyrażenia tego.
źródło