Qual é a melhor maneira de fazer uma classificação inversa em scala? Eu imagino que o seguinte seja um pouco lento.
list.sortBy(_.size).reverse
Existe uma maneira conveniente de usar sortBy, mas obter uma classificação reversa? Eu preferiria não precisar usar sortWith
.
Respostas:
Pode haver uma maneira óbvia de alterar o sinal, se você classificar por algum valor numérico
De maneira mais geral, a classificação pode ser feita pelo método classificado com um Pedido implícito, que você pode tornar explícito, e o Pedido tem um reverso (não a lista abaixo). Você pode fazer
Se a ordem que você deseja reverter for a ordem implícita, você poderá obtê-la implicitamente [Ordering [A]] (A do tipo que você está solicitando) ou melhor Ordering [A]. Isso seria
sortBy é como usar Ordering.by, para que você possa
Talvez não seja o mais curto para escrever (em comparação com menos), mas a intenção é clara
Atualizar
A última linha não funciona. Para aceitar o
_
inOrdering.by(_.size)
, o compilador precisa saber em qual tipo estamos solicitando, para que ele possa digitar o_
. Pode parecer que esse seria o tipo do elemento da lista, mas não é assim, como é a assinatura da classificaçãodef sorted[B >: A](ordering: Ordering[B])
. A ordem pode estar ativadaA
, mas também em qualquer ancestral deA
(você pode usarbyHashCode : Ordering[Any] = Ordering.by(_.hashCode)
). E, de fato, o fato de que a lista é covariante força essa assinatura. Pode-se fazermas isso é muito menos agradável.
fonte
list.sortBy(x => (-x.size, x.forTiesUseThisField))
list.sorted(Ordering.by((_: TheType).size).reverse)
considerá-list.sorted(Ordering.by[TheType, Int](_.size).reverse)
lo mais claro (mas mais longo) para o meu ponto de vista.list.sortBy(_.size)(Ordering[Int].reverse)
também gosto .fonte
talvez para encurtar um pouco mais:
fonte
Fácil, fácil (pelo menos em caso de
size
):fonte
sortBy
possui parâmetro implícitoord
que fornece pedidosentão, podemos definir o próprio
Ordering
objetofonte
Ambos
sortWith
esortBy
possuem uma sintaxe compacta:Acho o
sortWith
mais fácil de entender.fonte
fonte
Outra possibilidade nos casos em que você passa uma função que talvez não consiga modificar diretamente para um Arraybuffer via sortWith, por exemplo:
fonte
este é o meu código;)
fonte