¿Cuál es la mejor manera de hacer una ordenación inversa en scala? Me imagino que lo siguiente es algo lento.
list.sortBy(_.size).reverse
¿Hay una manera conveniente de usar sortBy pero obteniendo una clasificación inversa? Prefiero no necesitar usar sortWith
.
Respuestas:
Puede haber una forma obvia de cambiar el signo, si ordena por algún valor numérico
En términos más generales, la ordenación se puede realizar por un método ordenado con un ordenamiento implícito, que puede hacer explícito, y el ordenamiento tiene un reverso (no el reverso de la lista a continuación).
Si el orden que desea revertir es el ordenamiento implícito, puede obtenerlo implícitamente [Ordenar [A]] (A del tipo que está ordenando) o mejor Ordenar [A]. Eso sería
sortBy es como usar Ordering.by, por lo que puedes hacer
Quizás no sea el más corto de escribir (en comparación con menos) pero la intención es clara
Actualizar
La última línea no funciona. Para aceptar el
_
inOrdering.by(_.size)
, el compilador necesita saber en qué tipo estamos ordenando, para que pueda escribir el_
. Puede parecer que ese sería el tipo de elemento de la lista, pero esto no es así, como lo es la firma de ordenadodef sorted[B >: A](ordering: Ordering[B])
. El pedido puede estar activadoA
, pero también en cualquier antecesor deA
(puede usarbyHashCode : Ordering[Any] = Ordering.by(_.hashCode)
). Y, de hecho, el hecho de que la lista es covariante obliga a esta firma. Uno puede hacerPero esto es mucho menos agradable.
fuente
list.sortBy(x => (-x.size, x.forTiesUseThisField))
list.sorted(Ordering.by((_: TheType).size).reverse)
considerarlolist.sorted(Ordering.by[TheType, Int](_.size).reverse)
más claro (pero más largo) para mi punto de vista.list.sortBy(_.size)(Ordering[Int].reverse)
también me gusta .fuente
quizás para acortarlo un poco más:
fuente
Fácil guisante (al menos en caso de
size
):fuente
sortBy
tiene un parámetro implícitoord
que proporciona ordenentonces, podemos definir un
Ordering
objeto propiofuente
Ambos
sortWith
ysortBy
tienen una sintaxis compacta:Encuentro el que es
sortWith
más fácil de entender.fuente
fuente
Otra posibilidad en los casos en que pasa una función que no puede modificar directamente a un Arraybuffer mediante sortWith, por ejemplo:
fuente
este es mi código;)
fuente