Scala:HashMap可以为不同的键提供不同的数据类型吗?

1 scala wildcard hashmap listbuffer

我对Scala编程完全不熟悉,我有以下问题:

我需要一个HashMap,它可以包含许多数据类型(Int,String等).在C++中,我会使用BOOST的MultiMap.我听说在Scala中有一个MultiMap特征可用.基本上我想要的是以下内容:

val map = HashMap[String, ListBuffer[_]]
Run Code Online (Sandbox Code Playgroud)

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)))
Run Code Online (Sandbox Code Playgroud)

基本上它是有效的.我的第一个问题是,是否有可能在Scala中实现相同的行为而不使用ListBuffer作为间接层.

例如,使用以下内容获取Map:Map((String,1),(String,"String value"),...)

当我现在尝试使用上面的ListBuffer-Implementation时,我得到以下类型不匹配错误:

found   : _$1 where type _$1
required: _$3 where type _$3
Run Code Online (Sandbox Code Playgroud)

我基本上试图做以下事情:

我使用迭代器迭代地图的键:

var valueIds = new ListBuffer[Int]()
val iterator = map.keys
iterator.foreach(key => { valueIds += setValue((map.apply(key)).last) }
Run Code Online (Sandbox Code Playgroud)

setValue返回Int,是一个必须对ListBuffers最后一个元素执行某些操作的方法.

有谁知道如何修复上述类型不匹配?

谢谢你的帮助!

问候

Rex*_*err 6

您是否需要为每个密钥存储多个值?如果是这样,ListBuffer无论如何都需要使用或其他集合.(Scala的MultiMap商店设置,所以如果你需要保留副本,它们将无法工作.)

如果您不需要为每个键存储多个值,那么您只需要以下Any类型:

scala> val map = collection.mutable.HashMap[String,Any]()
map: scala.collection.mutable.HashMap[String,Any] = Map()

scala> map += "One" -> 1
res1: map.type = Map((One,1))

scala> map += "Two" -> "ii"
res2: map.type = Map((Two,ii), (One,1))

scala> map += "Three" -> None
res3: map.type = Map((Three,None), (Two,ii), (One,1))
Run Code Online (Sandbox Code Playgroud)

您现在可能需要进行模式匹配或使用collect来执行对值有用的任何操作:

scala> map.values.foreach(_ match { case i: Int => println("We stored the number "+i) })
We stored the number 1

scala> map.values.collect{ case i: Int => i }
res4: Iterable[Int] = List(1)
Run Code Online (Sandbox Code Playgroud)