web-dev-qa-db-ja.com

Scalaマップの並べ替え

この種類のマップを並べ替えるには:

"01" -> List(34,12,14,23), "11" -> List(22,11,34)

最初の値まで?

24

1つの方法は、常にキーによってソートされるscala.collection.immutable.TreeMapを使用することです。

val t = TreeMap("01" -> List(34,12,14,23), "11" -> List(22,11,34))

//If  you have already a map...
val m = Map("01" -> List(34,12,14,23), "11" -> List(22,11,34))
//... use this
val t = TreeMap(m.toSeq:_*)

それをシーケンスまたはリストに変換してソートすることもできます:

//by specifying an element for sorting
m.toSeq.sortBy(_._1) //sort by comparing keys
m.toSeq.sortBy(_._2) //sort by comparing values

//by providing a sort function
m.toSeq.sortWith(_._1 < _._1) //sort by comparing keys

可能性はたくさんありますが、それぞれが特定のコンテキストで多かれ少なかれ便利です。

61
Landei

述べたように、デフォルトのMapタイプはソートされていませんが、常にSortedMapがあります

import collection.immutable.SortedMap
SortedMap("01" -> List(34,12,14,23), "11" -> List(22,11,34))

私はあなたがそれを使用できないと思いますが、私はこの宿題を認識し、あなたのマップがgroupBy操作の結果であると疑っています。したがって、空のSortedMapを作成して値を追加する必要があります。

val unsorted = Map("01" -> List(34,12,14,23), "11" -> List(22,11,34))
val sorted = SortedMap.empty[String, List[Int]] ++ unsorted
//or
val sorted = SortedMap(unsorted.toSeq:_*)

または、Mapインターフェースに慣れていない場合は、それをタプルのシーケンスに変換できます。このアプローチは、キーと値の両方に定義された順序がある場合にのみ機能することに注意してください。リストにはデフォルトの順序が定義されていないため、これはサンプルコードでは機能しません-そのため、代わりに他の数値をいくつか作成しました。

val unsorted = Map("01" -> 56, "11" -> 34)
val sorted = unsorted.toSeq.sorted

これは、最初にリストを他のタイプ(文字列など)に変換できる場合に便利です。これは、mapValuesを使用して行うのが最適です。

pdate: Landeiの回答を参照してください。このアプローチを機能させるカスタムソート関数を提供する方法が示されています。

16
Kevin Wright