私は Scala を使ったプログラミングがまったく初めてで、次の問題があります。
多くのデータ型 (Int、String など) を含むことができる HashMap が必要です。C++ では、BOOST の MultiMap を使用します。Scala には MultiMap トレイトが用意されていると聞いたことがあります。基本的に私がしたいことは次のとおりです。
val map = HashMap[String, ListBuffer[_]]
ListBuffer の要素の具体的なデータ型は、実行時に決定されます。この実装をコンソールでテストすると、次のように動作します。
scala> val a = new HashMap[String, ListBuffer[_]]()
a: scala.collection.mutable.HashMap[String,scala.collection.mutable.ListBuffer[_]] = Map()
scala> val b = new ListBuffer[String]()
b: scala.collection.mutable.ListBuffer[String] = ListBuffer()
scala> val c = new ListBuffer[Int]()
c: scala.collection.mutable.ListBuffer[Int] = ListBuffer()
scala> b += "String"
res0: b.type = ListBuffer(String)
scala> c += 1
res1: c.type = ListBuffer(1)
scala> a += "String Buffer" -> b
res2: a.type = Map((String Buffer,ListBuffer(String)))
scala> a += "This is an Int Buffer" -> c
res3: a.type = Map((String Buffer,ListBuffer(String)), (This is an Int Buffer,ListBuffer(1)))
したがって、基本的には機能します。私の最初の質問は、ListBuffer を間接レイヤーとして使用せずに、Scala で同じ動作を実装する可能性があるかどうかです。
たとえば、次の内容のマップを取得します: Map((String, 1),(String, "String value"), ...)
上記の ListBuffer-Implementation を使用しようとすると、次の型の不一致エラーが発生します。
found : _$1 where type _$1
required: _$3 where type _$3
私は基本的に次のことをしようとしています:
イテレータを使用して、マップのキーを反復処理します。
var valueIds = new ListBuffer[Int]()
val iterator = map.keys
iterator.foreach(key => { valueIds += setValue((map.apply(key)).last) }
setValue は Int を返し、ListBuffers の最後の要素を処理する必要があるメソッドです。
上記のタイプの不一致を修正する方法を知っている人はいますか?
ご協力いただきありがとうございます!
よろしく