What's the best way to inverse sort in scala? Ask Question

What's the best way to inverse sort in scala? Ask Question

What is the best way to do an inverse sort in scala? I imagine the following is somewhat slow.

list.sortBy(_.size).reverse

Is there a conveinient way of using sortBy but getting a reverse sort? I would rather not need to use sortWith.

ベストアンサー1

There may be the obvious way of changing the sign, if you sort by some numeric value

list.sortBy(- _.size)

More generally, sorting may be done by method sorted with an implicit Ordering, which you may make explicit, and Ordering has a reverse (not the list reverse below) You can do

list.sorted(theOrdering.reverse)

If the ordering you want to reverse is the implicit ordering, you can get it by implicitly[Ordering[A]] (A the type you're ordering on) or better Ordering[A]. That would be

list.sorted(Ordering[TheType].reverse)

sortBy is like using Ordering.by, so you can do

list.sorted(Ordering.by(_.size).reverse)

Maybe not the shortest to write (compared to minus) but intent is clear

Update

The last line does not work. To accept the _ in Ordering.by(_.size), the compiler needs to know on which type we are ordering, so that it may type the _. It may seems that would be the type of the element of the list, but this is not so, as the signature of sorted is def sorted[B >: A](ordering: Ordering[B]). The ordering may be on A, but also on any ancestor of A (you might use byHashCode : Ordering[Any] = Ordering.by(_.hashCode)). And indeed, the fact that list is covariant forces this signature. One can do

list.sorted(Ordering.by((_: TheType).size).reverse)

but this is much less pleasant.

おすすめ記事