在scala中反向sorting的最好方法是什么?

在scala中做逆向sorting的最好方法是什么? 我想象下面有点慢。

list.sortBy(_.size).reverse 

有没有一种使用sortBy的方法,但得到一个反向sorting? 我宁愿不需要使用sortWith

如果按某个数值进行sorting,可能会有更改符号的明显方法

 list.sortBy(- _.size) 

更一般地说,sorting可以通过使用隐式sorting的方法来完成,您可以进行显式sorting,sorting有相反的排列方式(不是下面的列表)您可以执行

 list.sorted(theOrdering.reverse) 

如果要反转的顺序是隐式顺序,可以通过隐式[Ordering [A]](A所订购的types)或更好的Ordering [A]来获得。 那将是

 list.sorted(Ordering[TheType].reverse) 

sortBy就像使用Ordering.by,所以你可以做

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

也许不是最短的写(相对于减号),但意图是明确的

更新

最后一行不起作用。 要接受Ordering.by(_.size) ,编译器需要知道我们要订购哪种types,以便可以键入_ 。 它可能似乎是列表元素的types,但事实并非如此,因为sorting的签名是def sorted[B >: A](ordering: Ordering[B]) 。 sorting可以在A ,也可以在A任何祖先上(你可以使用byHashCode : Ordering[Any] = Ordering.by(_.hashCode) )。 实际上,名单是协变的这一事实迫使这个签名。 可以做

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

但是这不太愉快。

 list.sortBy(_.size)(Ordering[Int].reverse) 

也许可以缩短一点:

 def Desc[T : Ordering] = implicitly[Ordering[T]].reverse List("1","22","4444","333").sortBy( _.size )(Desc) 

容易peasy(至less在size情况下):

 scala> val list = List("abc","a","abcde") list: List[java.lang.String] = List(abc, a, abcde) scala> list.sortBy(-_.size) res0: List[java.lang.String] = List(abcde, abc, a) scala> list.sortBy(_.size) res1: List[java.lang.String] = List(a, abc, abcde) 

sortBy具有提供sorting的隐式参数ord

 def sortBy [B] (f: (A) ⇒ B)(implicit ord: Ordering[B]): List[A] 

所以,我们可以定义自己的Ordering对象

 scala> implicit object Comp extends Ordering[Int] { | override def compare (x: Int, y: Int): Int = y - x | } defined module Comp List(3,2,5,1,6).sortBy(x => x) res5: List[Int] = List(6, 5, 3, 2, 1) 
 val list = List(2, 5, 3, 1) list.sortWith(_>_) -> res14: List[Int] = List(5, 3, 2, 1) list.sortWith(_<_) -> res14: List[Int] = List(1, 2, 3, 5) 

sortWithsortBy都有一个紧凑的语法:

 case class Foo(time:Long, str:String) val l = List(Foo(1, "hi"), Foo(2, "a"), Foo(3, "X")) l.sortWith(_.time > _.time) // List(Foo(3,X), Foo(2,a), Foo(1,hi)) l.sortBy(- _.time) // List(Foo(3,X), Foo(2,a), Foo(1,hi)) l.sortBy(_.time) // List(Foo(1,hi), Foo(2,a), Foo(3,X)) 

我觉得这个比较容易理解。

另一种可能性是,如果你传递了一个你可能无法通过sortWith直接修改的函数,例如:

 val buf = collection.mutable.ArrayBuffer[Int]() buf += 3 buf += 9 buf += 1 // the sort function (may be passed through from elsewhere) def sortFn = (A:Int, B:Int) => { A < B } // the two ways to sort below buf.sortWith(sortFn) // 1, 3, 9 buf.sortWith((A,B) => { ! sortFn(A,B) }) // 9, 3, 1 

这是我的代码;)

val(word,word)= logData.flatMap(line => line.split(“”))。map(word =>(word,1))。reduceByKey((a,b)=> a + b)

wordCounts.sortBy( – _._ 2).collect()