在Scala中映射内部地图

时间:2011-08-09 12:11:17

标签: scala map

我有这段代码:

val total = ListMap[String,HashMap[Int,_]]
val hm1 = new HashMap[Int,String]
val hm2 = new HashMap[Int,Int]
...
//insert values in hm1 and in hm2
...
total += "key1" -> hm1
total += "key2" -> hm2

....

val get = HashMap[Int,String] = total.get("key1") match {
  case a : HashMap[Int,String] => a
}

这项工作,但我知道是否存在更好(更易读)的方法来做到这一点。 谢谢大家!

4 个答案:

答案 0 :(得分:4)

看起来你正试图将元组重新实现为地图。

val total : ( Map[Int,String], Map[Int,Int]) = ...

def get : Map[Int,String] = total._1

答案 1 :(得分:0)

(编辑:哦,对不起,我现在就知道了)

这就是事情:上面的代码不起作用。类型参数已擦除,因此上面的匹配将始终返回true - 例如,尝试使用key2

如果您想在Map上存储多种类型并将其检索到后者,则需要使用Manifest和专门的getput方法。但这已经是Stack Overflow的答案了,所以我不会在这里重复一遍。

答案 2 :(得分:0)

最好避免使用包含非统一值类型的地图的total地图。问题是,当您在"key1"检索地图,然后将其投射到字符串地图时,为什么选择String

最简单的原因可能是key1等等只是常量,你在编写代码时就知道所有这些常量。在这种情况下,您可能应该为每个地图都有val,并完全省略地图地图。

客户端代码发出的调用可能具有此知识。假设客户端执行stringMap(“key1”)或intMap(“key2”)或者这种或那种方式,调用意味着某些给定的类型是预期的。客户负责不混合类型和名称。在这种情况下,没有理由总计。你会得到一个字符串映射的映射,一个int映射的映射(假设你以前知道有限数量的值类型)

你有什么理由得到总数?

答案 3 :(得分:0)

首先:这是一个非答案(因为我不推荐我讨论的方法),但是评论太长了。

如果您的ListMap中没有太多不同的键,我建议尝试Malvolio的答案。 否则,由于类型擦除,基于模式匹配的其他方法实际上与此相同(有效,但非常不安全):

val get = total("key1").asInstanceOf[HashMap[Int, String]]

这是不安全的原因(除非你喜欢生活危险)是:

  1. total(“key1”)未返回选项(与total.get(“key1”)不同)。如果“key1”不存在,则会抛出NoSuchElementException。我不知道你是怎么计划管理“无”案件的。
  2. asInstanceOf也会愉快地演绎total(“key2”) - 它应该是一个HashMap [Int,Int],但在这一点上是一个HashMap [Int,Any] - 到一个HashMap [Int,String]。稍后当您尝试访问Int值(现在scala认为是String)
  3. 时,您将遇到问题