1

を定義しましたMap[Int, Map[String, Int]]

ListMapを使用して、外側のマップを並べ替える方法を知っています。例えば:

実際、すべてのマップは変更可能です。

var myMap: Map[ Int, scala.collection.mutable.Map[String, Int] ] = Map()
....
// add some items to myMap
....
var sortedMap = scala.collection.immutable.ListMap( myMap.toList.sortBy{_._1}:_* )

しかし、文字列に従って内部マップを並べ替えるにはどうすればよいですか?

以下は間違っているようです:

myMap foreach {
    case ( num, map ) ⇒ 
        map = scala.collection.immutable.ListMap( map.toList.sortBy{_._1}:_* ) 
}

コンパイラはと言いますmap: reassignment to valが、私はすでに内部マップをとして定義していmutable.Mapます。私に何ができる?

4

3 に答える 3

0

の使用を検討することもできますTreeMap。これにより、後でマップを並べ替える必要がなくなります。

TreeMap変更可能なものはありませんが、これは大きな問題ではないことに注意してください(おそらく意図的なものです)。構造が可変であるか不変であるかに関わらずTreeMap、バランスの取れたツリーに要素を追加するとO(log n)が必要になるため、可変があることには大きなメリットはありません。

これは、使用することTreeMapは、他の種類のコレクションを持ち、後でそれをソートすることと同じ漸近的な複雑さを持っていることも意味します。n個の要素をaに追加するTreeMapと、n O(log n)= O(n log n)になります。これは、 n個の要素のリストを並べ替えるのとまったく同じです。

TreeMapまた、のコンストラクターには暗黙の引数があることに注意してくださいordering: Ordering[A]。マップの作成時に明示的に設定することで、デフォルトとは異なる基準を使用して並べ替える場合に、独自の並べ替え機能をプラグインできます。

于 2012-10-23T16:31:06.540 に答える
0

を使用して各値に関数をmapValues適用し、同じ並べ替え関数を 2 番目のマップに適用できます。

import scala.collection.immutable.ListMap

val myMap = Map[ Int, scala.collection.mutable.Map[String, Int] ] = Map()
....
// add some items to myMap
....
val outerSortedMap = ListMap(myMap.toList.sortBy{_._1}:_* )
val innerSortedMap = myMap.mapValues(innerMap => 
  ListMap(innerMap.toList.sortBy{_._1}:_* )
)

内側と外側の両方の Map を並べ替える

このためには、最初に外側の Map を並べ替え (outerSortedMap上記で説明したように取得します)、次に の内側の Map を並べ替えるだけですouterSortedMap

val innerOuterSortedMap = outerSortedMap.mapValues(innerMap =>
  ListMap(innerMap.toList.sortBy{_._1}:_*)
)

あなたの試みについて

foreach メソッドには次のシグネチャがあります: foreach[U](f: ((A, B)) ⇒ U): Unit、したがって、これは副作用メソッドです。あなたが望むのは、あなたのすべての値に関数を適用し、mapその値を関数の結果で置き換えることです。これは基本的にmap関数であり (yesmapは 2 つのまったく異なるものを表します)、値をマップしたい場合、関数mapValuesが存在します!

于 2012-10-23T09:19:20.420 に答える
0

sortMap自分でヘルパー関数を定義すると、かなりきれいになります。

def sortMap[K: Ordering, V](m: scala.collection.Map[K, V]) = 
  ListMap(m.toList.sortBy { _._1 }: _*)

val doubleSortedMap = sortMap(myMap.mapValues(sortMap(_)))
于 2012-10-23T19:53:38.990 に答える