Scalaで逆ソートを行う最良の方法は何ですか?以下は少し遅いと思います。
list.sortBy(_.size).reverse
sortByを使用する便利な方法はありますか?を使用する必要はありませんsortWith
。
Scalaで逆ソートを行う最良の方法は何ですか?以下は少し遅いと思います。
list.sortBy(_.size).reverse
sortByを使用する便利な方法はありますか?を使用する必要はありませんsortWith
。
回答:
数値でソートする場合、符号を変更する明らかな方法があるかもしれません
list.sortBy(- _.size)
より一般的には、ソートは暗黙的なOrderingでソートされたメソッドによって行われる場合があり、これは明示的に行うことができ、Orderingは逆になります(以下のリストの逆ではありません)
list.sorted(theOrdering.reverse)
逆にしたい順序が暗黙的な順序である場合は、暗黙的に[Ordering [A]](Aは、順序付けしている型)またはより良いOrdering [A]によって取得できます。それは
list.sorted(Ordering[TheType].reverse)
sortByはOrdering.byを使用するようなものです。
list.sorted(Ordering.by(_.size).reverse)
(マイナスと比較して)書くのに最短ではないかもしれませんが、意図は明らかです
更新
最後の行は機能しません。_
in を受け入れるにはOrdering.by(_.size)
、コンパイラーが順序付けする型を知っている必要があります。これにより、コンパイラーはを入力できるようになり_
ます。それはリストの要素のタイプと思われるかもしれませんが、sortedのシグネチャはであるため、これはそうではありません
def sorted[B >: A](ordering: Ordering[B])
。順序はである可能性がありますがA
、A
(あなたが使用するかもしれないbyHashCode : Ordering[Any] = Ordering.by(_.hashCode)
)の祖先でもあります。そして実際、リストが共変であるという事実は、この署名を強制します。できる
list.sorted(Ordering.by((_: TheType).size).reverse)
しかし、これはあまり快適ではありません。
list.sortBy(x => (-x.size, x.forTiesUseThisField))
list.sorted(Ordering.by((_: TheType).size).reverse)
は、list.sorted(Ordering.by[TheType, Int](_.size).reverse)
それをより明確に(ただしより長く)考える。
list.sortBy(_.size)(Ordering[Int].reverse)
も好きです。
sortBy
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)
どちらsortWith
とsortBy
コンパクトな構文を持っています。
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 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)
たとえば、sortWithを介してArraybufferに直接変更できない可能性がある関数を渡す場合の別の可能性:
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 wordCounts = logData.flatMap(line => line.split(" "))
.map(word => (word, 1))
.reduceByKey((a, b) => a + b)
wordCounts.sortBy(- _._2).collect()