web-dev-qa-db-ja.com

Scala:タプルの配列を2番目の要素でソートするにはどうすればよいですか?

Scalaに任意の比較関数を使用してタプルの配列をソートする方法はありますか?特に、2番目の要素でタプルの配列と配列をソートする必要がありますが、一般的な手法を知りたいタプルの配列をソートします。

ありがとう!

50
pau.estalella

次のコードを使用できます。

scala> val v = Array(('a', 2), ('b', 1))
v: Array[(Char, Int)] = Array((a,2), (b,1))

scala> scala.util.Sorting.stableSort(v,
     | (e1: (Char, Int), e2: (Char, Int)) => e1._2 < e2._2)

scala> v
res11: Array[(Char, Int)] = Array((b,1), (a,2))

幸いなことに、Scala=はstableSortに渡される配列の型を推測できないようです。これで問題ないことを願っています。

23
Michel Krämer

scala 2.8では、sortByメソッドがあります。簡単な使用例は次のとおりです。

scala> val arr = Array(("One",1),("Two",2),("Four",4),("Three",3))
arr: Array[(Java.lang.String, Int)] = Array((One,1), (Two,2), (Four,4), (Three,3))

scala> arr.sortBy(_._2)
res0: Array[(Java.lang.String, Int)] = Array((One,1), (Two,2), (Three,3), (Four,4))

scala>
122
Eastsun

Arrayの場合、インプレースソートアルゴリズムを使用するのが一般的です。ただし、イディオマティックScalaコードでは、通常、可変コレクションは推奨/使用されません。その場合、不変コレクションがある場合(またはArrayを変更しない場合) )、sortWithを使用:

scala> val a = Array(1, 3, 2, 5)
a: Array[Int] = Array(1, 3, 2, 5)

scala> a.sortWith(_ > _)
res6: Array[Int] = Array(5, 3, 2, 1)

scala> a
res7: Array[Int] = Array(1, 3, 2, 5)

Arrayまたはその他のタプルのコレクションのソート:

scala> val a = Array(('a', 1), ('b', 4), ('c', 5), ('d', 2))
a: Array[(Char, Int)] = Array((a,1), (b,4), (c,5), (d,2))

scala> a.sortWith(_._2 > _._2)
res4: Array[(Char, Int)] = Array((c,5), (b,4), (d,2), (a,1))

scala> a
res5: Array[(Char, Int)] = Array((a,1), (b,4), (c,5), (d,2))
9
Erik Allik

Scala 2.8(はい、再び:))で、これを行うこともできます:

val v = Array(('a', 2), ('b', 1))
scala.util.Sorting.stableSort(v)(manifest[(Char, Int)], Ordering.by(_._2))

ペアの特定の場合、これはfirstを2番目の要素でソートし、次に最初の要素でソートすることもできます。

scala.util.Sorting.stableSort(v)(manifest[(Char, Int)], Ordering.by(_.swap))
3

2.7でなく:

(Array((2,3), (4,2), (1,5)).toList.sort (_._2 < _._2)).toArray
2
user unknown

おそらくscala.util.Sortingのdef stableSort[K](a : Seq[K], f : (K, K) => Boolean) : Array[K]が必要でしょう。
比較関数は_._2 < _._1

1
tstenner
val l = List((2, 1), (3, 2), (0, 3))
l sort { case(a, b) => a > b }
1
Jawher