Il existe un moyen évident de changer le signe, si vous triez par une valeur numérique.
list.sortBy(- _.size)
Plus généralement, le tri peut être fait par la méthode sorted avec un Ordering implicite, que vous pouvez rendre explicite, et l'Ordering a un reverse (pas le reverse de liste ci-dessous) Vous pouvez faire
list.sorted(theOrdering.reverse)
Si l'ordonnancement que vous voulez inverser est l'ordonnancement implicite, vous pouvez l'obtenir par implicitement [Ordering[A]] (A le type sur lequel vous ordonnez) ou mieux Ordering[A]. Ce serait
list.sorted(Ordering[TheType].reverse)
sortBy est comme l'utilisation de Ordering.by, vous pouvez donc faire
list.sorted(Ordering.by(_.size).reverse)
Peut-être pas le plus court à écrire (par rapport aux moins) mais l'intention est claire.
Mise à jour
La dernière ligne ne fonctionne pas. Pour accepter le _
sur Ordering.by(_.size)
le compilateur a besoin de savoir quel type nous commandons, afin qu'il puisse taper l'élément _
. Il peut sembler que ce serait le type de l'élément de la liste, mais ce n'est pas le cas, car la signature de trié est def sorted[B >: A](ordering: Ordering[B])
. La commande peut se faire sur A
mais aussi sur tout ancêtre de A
(vous pouvez utiliser byHashCode : Ordering[Any] = Ordering.by(_.hashCode)
). Et en effet, le fait que la liste soit covariante force cette signature. On peut faire
list.sorted(Ordering.by((_: TheType).size).reverse)
mais c'est beaucoup moins agréable.