ScalaでSeq(List)をソート

要素をそのまま比較する単純なソート (sorted)

val s1 = Seq(6,1,3,3)
val r1 = s1.sorted

r1: Seq[Int] = List(1, 3, 3, 6)

 

要素に演算とかを施して比較する場合 (sortBy)

// tupleの最初の要素を大文字にした結果でソート
val s2 = Seq(("C",3),("a",1),("B",2))
val r2 = s2.sortBy(_._1.toUpperCase) 


 r2: Seq[(String, Int)] = List((a,1), (B,2), (C,3))

インスタンスの特定要素で単純にソートするならこれが便利

 

関数を渡して比較するソート (sortWith)

val s3 = Seq("a","Z","C","e")
val r3 = s3.sortWith((a,b) => a.compareToIgnoreCase(b) < 0)

r3: Seq[String] = List(a, C, e, Z)

これは色んなケースに対応できて一番使う気がします。つかこれを覚えておけば大体いける。

 

Javaで言うComparator的な比較用インスタンスを渡してソート (sorted + Ordering )

val s4 = Seq("a","Z","C","e")
val r4 = s4.sorted(new Ordering[String]{
  def compare(a:String,b:String):Int = {
    a.compareToIgnoreCase(b)
  }
})

r4: Seq[String] = List(a, C, e, Z)

うん、面倒。
だけどOrderingクラスを作っておけば使いまわせるのがイイですね。
複雑な要件でのソートであればこれか。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です