Może być oczywiste wa y zmianę znaku, w przypadku sortowania według pewnej wartości liczbowej
list.sortBy(- _.size)
Bardziej ogólnie, sortowania mogą być wykonywane metodą sortowanych z domniemanym zamawianiu których można dokonać wyraźnego i zamawiania ma odwrotnie (nie listy reverse poniżej) można zrobić
list.sorted(theOrdering.reverse)
przypadku zamawiania chcesz odwrócić kolejność jest niejawna, można dostać go w sposób dorozumiany [zamawiania [A]] (A typem jesteś zamawiania on) lub lepiej Zamawianie [A]. To byłoby
list.sorted(Ordering[TheType].reverse)
SortBy jest jak używanie Ordering.by, więc można zrobić
list.sorted(Ordering.by(_.size).reverse)
nie
Może najkrótsza napisać (w porównaniu do minus), ale intencja jest jasna
Aktualizacja
Ostatnia linia nie działa. Aby zaakceptować _
w Ordering.by(_.size)
, kompilator musi wiedzieć, jaki typ zamawiamy, aby mógł wpisać _
. Może się wydawać, że byłby to typ elementu listy, ale tak nie jest, ponieważ podpis posortowany jest def sorted[B >: A](ordering: Ordering[B])
. Zamówienie może być na A
, ale także na dowolnym przodku A
(możesz użyć byHashCode : Ordering[Any] = Ordering.by(_.hashCode)
). I rzeczywiście fakt, że lista jest kowariantna wymusza ten podpis. Można zrobić
list.sorted(Ordering.by((_: TheType).size).reverse)
ale jest to znacznie mniej przyjemne.
rozwiązania są bardzo ładne, ale ja jeszcze znaleźć swój oryginalny sposób robi to łatwiejsze do odczytania. Potwierdziłem, że istnieje podejrzenie wad obliczeniowych dla tego sposobu pisania. Test I nie jest tak: val zegara = nowy czasowy (1 do 1e6.toInt) .sorted (zamawiania [Int] .reverse) clock.addLap ("prawidłowy sposób") (1 do 1e6.toInt) .sorted.reverse clock.addLap ("niepoprawny sposób") println (clock.toString) [poprawny sposób, okrążenie = 76, dur. = 76] | [Niepoprawny sposób, okrążenie = 326, dur. = 250] – BlueSky