como classificar uma lista no Scala por dois campos, neste exemplo irei classificar por lastName e 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)
Eu tento coisas assim
rows.sortBy(_.lastName + _.firstName)
mas não funciona. Portanto, estou curioso por uma solução boa e fácil.
scala
sorting
functional-programming
Twistleton
fonte
fonte
Ordering
porRow
classe e usá-lo comsorted
método como este:rows.sorted(customOrdering)
. Você também pode usar costumeOrdering
paraTuple2
assim:rows.sortBy(r => (r.lastName, r.firstName))( Ordering.Tuple2(Ordering.String.reverse, Ordering.String) )
.customOrdering
comoOrdering[Row]
manualmente ou usarOrdering.by
assim:val customOrdering =
Ordering.by ((r: Row) => (r.lastName, r.firstName)) (Ordering.Tuple2 (Ordering.String.reverse, Ordering.String)) `rows.sortBy(r => (-r.field1, -r.field2))
-
comString
. Você deve usarOrdering::reverse
desta forma:rows.sortBy(r => (r.lastName, r.firstName))(implicitly[Ordering[(String, String)]].reverse)
.Se você quiser classificar pelos nomes mesclados, como na sua pergunta, ou
se você deseja classificar primeiro por lastName, então firstName; relevante para nomes mais longos (Wild, Wilder, Wilderman).
Se você escrever
com 2 sublinhados, o método espera dois parâmetros:
fonte
Em geral, se você usar um algoritmo de classificação estável, poderá classificar por uma chave e depois pela próxima.
O resultado final será classificado pelo sobrenome e, onde for igual, pelo nome.
fonte
sortBy
usa classificação estável? Caso contrário, esta resposta não tem sentido.rows
é uma lista imutável esortBy
retorna um novo valor em vez de modificar aquele no qual funciona (mesmo em classes mutáveis). Portanto, sua segunda expressão é apenas classificar a lista original não classificada.Talvez isso funcione apenas para uma lista de tuplas, mas
parece funcionar e ser uma forma simples de expressá-lo.
fonte