Quelle est la meilleure façon de faire un tri inverse dans scala? J'imagine que ce qui suit est un peu lent.
list.sortBy(_.size).reverse
Existe-t-il un moyen pratique d'utiliser sortBy mais d'obtenir un tri inversé? Je préfère ne pas utiliser sortWith
.
Réponses:
Il peut y avoir la manière évidente de changer le signe, si vous triez par une valeur numérique
Plus généralement, le tri peut être effectué par une méthode triée avec un ordre implicite, que vous pouvez rendre explicite, et le tri a un inverse (pas la liste inversée ci-dessous).
Si l'ordre que vous souhaitez inverser est l'ordre implicite, vous pouvez l'obtenir implicitement [Ordering [A]] (A le type sur lequel vous commandez) ou mieux Ordering [A]. Ce serait
sortBy, c'est comme utiliser Ordering.by, donc vous pouvez faire
Peut-être pas le plus court à écrire (par rapport au moins) mais l'intention est claire
Mettre à jour
La dernière ligne ne fonctionne pas. Pour accepter le
_
inOrdering.by(_.size)
, le compilateur doit savoir sur quel type nous commandons, afin qu'il puisse taper le_
. Il peut sembler que ce serait le type de l'élément de la liste, mais ce n'est pas le cas, comme l'est la signature de triédef sorted[B >: A](ordering: Ordering[B])
. L'ordre peut être activéA
, mais aussi sur n'importe quel ancêtre deA
(vous pourriez utiliserbyHashCode : Ordering[Any] = Ordering.by(_.hashCode)
). Et en effet, le fait que cette liste soit covariante force cette signature. On peut fairemais c'est beaucoup moins agréable.
la source
list.sortBy(x => (-x.size, x.forTiesUseThisField))
list.sorted(Ordering.by((_: TheType).size).reverse)
considérerlist.sorted(Ordering.by[TheType, Int](_.size).reverse)
plus clair (mais plus long) pour mon point de vue.list.sortBy(_.size)(Ordering[Int].reverse)
aussi.la source
peut-être pour le raccourcir un peu plus:
la source
Peasy facile (au moins en cas de
size
):la source
sortBy
a un paramètre impliciteord
qui fournit un ordredonc, nous pouvons définir notre propre
Ordering
objetla source
Les deux
sortWith
etsortBy
ont une syntaxe compacte:Je trouve celui avec
sortWith
plus facile à comprendre.la source
la source
Une autre possibilité dans les cas où vous passez une fonction que vous ne pourrez peut-être pas modifier directement à un Arraybuffer via sortWith par exemple:
la source
c'est mon code;)
la source