jak posortować listę w Scali według dwóch pól, w tym przykładzie posortuję według nazwy i imienia?Jak posortować listę w Scali według dwóch pól?
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ę rzeczy jak ten
rows.sortBy(_.lastName + _.firstName)
ale to nie działa. Tak więc jestem ciekawy dobrego i łatwego rozwiązania.
co jeśli chcemy cofnąć sortowanie na lastName, a następnie sortowanie naturalne na firstName? –
@SachinK: musisz stworzyć własny 'Ordering' dla klasy' Row' i użyć go z metodą "posortowaną" w następujący sposób: 'rows.sorted (customOrdering)'. Możesz również użyć niestandardowego 'Ordering' dla' Tuple2' w następujący sposób: 'rows.sortBy (r => (r.lastName, r.firstName)) (Ordering.Tuple2 (Ordering.String.reverse, Ordering.String))' . – senia
@SachinK: Możesz zaimplementować 'customOrdering' jako' Ordering [Row] 'ręcznie lub używając' Ordering.by' w ten sposób: 'val customOrdering =' Ordering.by ((r: Row) => (r.lastName, r .firstName)) (Ordering.Tuple2 (Ordering.String.reverse, Ordering.String)) ' – senia