Jaki jest najlepszy sposób sortowania odwrotnego w scali? Wyobrażam sobie, że poniższe czynności są nieco powolne.
list.sortBy(_.size).reverse
Czy istnieje wygodny sposób użycia sortBy, ale uzyskanie sortowania odwrotnego? Wolałbym nie używać sortWith
.
Odpowiedzi:
Może istnieć oczywisty sposób zmiany znaku, jeśli posortujesz według wartości liczbowej
Mówiąc bardziej ogólnie, sortowanie można przeprowadzić metodą posortowaną z niejawnym porządkiem, który można jawnie określić, a kolejność ma odwrotność (nie odwrócenie listy poniżej).
Jeśli kolejność, którą chcesz odwrócić, jest niejawną kolejnością, możesz ją uzyskać, niejawnie [Porządkowanie [A]] (A typ, na którym zamawiasz) lub lepiej Zamawianie [A]. To byłoby
sortBy przypomina korzystanie z Ordering.by, więc możesz to zrobić
Może nie najkrócej (w porównaniu z minusem), ale zamiar jest jasny
Aktualizacja
Ostatnia linia nie działa. Aby zaakceptować
_
inOrdering.by(_.size)
, kompilator musi wiedzieć, na jaki typ zamawiamy, aby mógł wpisać_
. Może się wydawać, że to byłby typ elementu listy, ale tak nie jest, jak podpis posortowanegodef sorted[B >: A](ordering: Ordering[B])
. Porządkowanie może być włączoneA
, ale także u każdego przodkaA
(możesz użyćbyHashCode : Ordering[Any] = Ordering.by(_.hashCode)
). I rzeczywiście, fakt, że lista jest kowariantna, wymusza ten podpis. Można to zrobićale to jest o wiele mniej przyjemne.
źródło
list.sortBy(x => (-x.size, x.forTiesUseThisField))
list.sorted(Ordering.by((_: TheType).size).reverse)
uważaćlist.sorted(Ordering.by[TheType, Int](_.size).reverse)
to za jaśniejsze (ale dłuższe) z mojego punktu widzenia.list.sortBy(_.size)(Ordering[Int].reverse)
też lubię .źródło
może skrócić to trochę bardziej:
źródło
Łatwe peasy (przynajmniej w przypadku
size
):źródło
sortBy
ma niejawny parametr,ord
który zapewnia porządkowaniewięc możemy zdefiniować własny
Ordering
obiektźródło
Oba
sortWith
isortBy
mają zwartą składnię:Uważam, że ten jest
sortWith
łatwiejszy do zrozumienia.źródło
źródło
Inna możliwość w przypadkach, gdy przekazujesz funkcję, której możesz nie być w stanie zmodyfikować bezpośrednio do bufora tablicy przez sortWith, na przykład:
źródło
to jest mój kod;)
źródło