2016-05-02 6 views
2

いくつかの奇妙な理由で、scala.collection.immutable.HashMapで宣言されているが、汎用のMap特性では宣言されていないこの1つのメソッドmergedがあります(実装によって、他のMapの実装には非常に不便です)。どのようにscalaをMapaから変換するのですか?scala.collection.immutable.HashMap?

私はMap[A, B]HashMap[A, B]に変換する必要があります。これまで簡単な方法を見つけることができません。これは私の現在の実装ですハックdef to[Col[_]]の周りにバイナリ高級の代わりに単なる高級を期待しています。

val m1 = Map("foo" -> 1) 
val m2 = Map("foo" -> 2, "bar" -> 2) 

type HM[_] = HashMap[String, Int] 
(m1.to[HM] merged m2.to[HM]) { case ((k1, v1), (k2, v2)) => (k1, v1 + v2) } // Map("foo" -> 3, "bar" -> 2) 

期待通りに動作しますが、私は(それがデフォルトの実装です与えられた)MapからHashMapに変換するためのより良い方法がなければならないと思うするのではなく、助けることはできません。

おそらくより一般的には、スカラコレクションの一般的な特性のデフォルト実装にアクセスするにはどうすればよいでしょうか?

+0

おそらく 'HashMap(m1.toSeq:_ *)'ですか?マップをマージするその他のオプションについては、http://stackoverflow.com/questions/7076128/best-way-to-merge-two-maps-and-sum-the-values-of-same-keyを参照してください。 –

+0

'HashMap'でのみ利用可能な操作を使用する場合、最初にあなたのマップを' HashMap'として宣言してみませんか? –

+0

@Łukaszええ私はその質問を見たことがありますが、私のコードのこの部分はパフォーマンスに非常に敏感で、 'toSeq'を使うには2回の反復が必要です。同じノートでは、 'merged 'はおそらく非常に効率的ですので、それを使うのがいいでしょう。 –

答えて

0

あなたは空のHashMapで始まり、そこにすべての要素を追加することができます。

immutable.HashMap.empty ++= yourMap 
+0

OPが 'immutable.HashMap'を望んでいた –

+0

@Łukasz:固定されていてもそれほど大きな違いはありません – Roman

+0

これは' ++ 'ではなく' ++ 'でなければなりません。 – Ben

0

これは、あなたの質問に答えないだろうが、それはあなたの問題を解決します。

  1. マージを行うために地図上に定義++メソッドを使用し
  2. 、あなたがマップに必要mergedメソッドを実装します: それだけに速くなります。
関連する問題