2016-07-06 4 views
1

Ich muss alle Werte eines bestimmten Schlüssels überprüfen, um zu sehen, ob der Wert bereits vorhanden ist. Mit dem Code, den ich unten habe, bekomme ich immer den letzten Wert, der dem Schlüssel hinzugefügt wurde. Wie man über die gesamte Werteliste iteriert?iterieren durch die Werte des angegebenen Schlüssels in der Scala-Hash-Map

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)} 

output:

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

, so dass Sie eine Art * Geschichte * haben wollen Ihre Karte? –

+2

Eine Karte darf nicht mehr als einen Wert für denselben Schlüssel enthalten. Die letzte überschreibt die vorherige. Vielleicht möchten Sie stattdessen MultiMap verwenden (http://www.scala-lang.org/api/2.9.0/scala/collection/mutable/MultiMap.html) –

Antwort

2

Ein Schlüssel ist in einem HashMap einzigartig. Sie können nicht mehrere Werte für denselben Schlüssel haben. Was Sie tun können, ist ein HashMap[Int, Set[String]] hat und prüfen, ob der Wert innerhalb des Satzes enthalten ist, oder noch einfacher als @TzachZohar weist darauf hin, ein 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

Warum wird die MultiMap benötigt? Es scheint, dass HashMap [Int, Set [String]] ausreichen würde. –

+1

'MultiMap' ist ein praktischer Wrapper um 'HashMap [Int, Set [String]]'. Sie können Daten an das Set anhängen, indem Sie einfach "mm.addBinding" aufrufen, anstatt das Problem zu umgehen, das Set aus der 'Map' zu extrahieren und dann das neue Set mit den hinzugefügten Daten anzuhängen. –