2012-07-08 78 views
4

我创建了一个MultiMap可变的多重映射到不可变的映射

val ms = 
    new collection.mutable.HashMap[String, collection.mutable.Set[String]]() 
    with collection.mutable.MultiMap[String, String] 

它,它已经填充了条目后,必须传递给期望一个Map[String, Set[String]]的功能。直接传递ms不工作,并试图通过toMap

ms.toMap[String, Set[String]] 

把它转换成一个不可变的映射产生

Cannot prove that (String, scala.collection.mutable.Set[String]) <:< (String, Set[String]). 

能,而无需手动遍历ms和插入所有条目到一个新的待解决不可变的地图?

回答

5

看来问题是可变的设置。所以变成一成不变套的工作原理:通过以下丹尼尔索布拉尔建议

scala> (ms map { x=> (x._1,x._2.toSet) }).toMap[String, Set[String]] 
res5: scala.collection.immutable.Map[String,Set[String]] = Map() 

甚至更​​好:

scala> (ms mapValues { _.toSet }).toMap[String, Set[String]] 
res7: scala.collection.immutable.Map[String,Set[String]] = Map() 
+0

什么是对的向下投票的原因吗? – pedrofurla 2012-07-08 22:26:10

+0

我没有downvote,但也许这是因为它是不必要的冗长,当你可以只写'ms.mapValues(_。toSet)' – 2012-07-09 03:42:48

+1

我真的不在乎谁投了票,只是为什么。在我看来,冗长不是问题的重点,也不是答案,所以它不应该是投票的理由。 – pedrofurla 2012-07-09 15:28:53

2

如何使用mapValues单独更改Set