2016-07-06 60 views
1

我需要检查给定键的所有值以查看该值是否已经存在。通过下面的代码,我总能得到最后一个值。如何迭代整个值列表?遍历scala散列映射中给定键的值

val map = scala.collection.mutable.HashMap.empty[Int, String] 
map.put(0, "a") 
map.put(0, "b") 
map.put(0, "c") 
map.put(0, "d") 
map.put(0, "e") 
map.put(0, "f") 

for ((k, v) <- map) {println("key: " + k + " value: " + v)} 

输出:

map: scala.collection.mutable.HashMap[Int,String] = Map() 
res0: Option[String] = None 
res1: Option[String] = Some(a) 
res2: Option[String] = Some(b) 
res3: Option[String] = Some(c) 
res4: Option[String] = Some(d) 
res5: Option[String] = Some(e) 

key: 0 value: f 
res6: Unit =() 
+0

所以你想有某种*历史*您地图? –

+2

映射不能包含同一个键​​的多个值。最后一个覆盖前一个。您可能想使用MultiMap(http://www.scala-lang.org/api/2.9.0/scala/collection/mutable/MultiMap.html) –

回答

2

的关键是在一个HashMap唯一的。您不能为同一个键拥有多个值。你可以做的是有一个HashMap[Int, Set[String]]并检查值是否包含在里面设置,或者甚至@TzachZohar指出简单,一个MultiMap

scala> import collection.mutable.{ HashMap, MultiMap, Set } 
import collection.mutable.{HashMap, MultiMap, Set} 

scala> val mm = new HashMap[Int, Set[String]] with MultiMap[Int, String] 
mm: scala.collection.mutable.HashMap[Int,scala.collection.mutable.Set[String]] with scala.collection.mutable.MultiMap[Int,String] = Map() 

scala> mm.addBinding(0, "a") 
res9: <refinement>.type = Map(0 -> Set(a)) 

scala> mm.addBinding(0, "b") 
res10: <refinement>.type = Map(0 -> Set(a, b)) 

scala> mm.entryExists(0, _ == "b") 
res11: Boolean = true 
+0

为什么需要MultiMap?看来HashMap [Int,Set [String]]就足够了。 –

+1

'MultiMap'是'HashMap [Int,Set [String]]'方便的包装。你可以简单地通过调用'mm.addBinding'来追加数据到集合中,而不需要从Map中提取集合,然后将新集合添加到新集合中。 –