Wie iteriere ich Scala Map?

81

Ich habe eine Scala-Karte:

attrs: Map[String , String]

Wenn ich versuche, über Karte wie zu iterieren;

attrs.foreach { key, value =>     }

das obige funktioniert nicht. In jeder Iteration muss ich wissen, was der Schlüssel und was der Wert ist. Was ist der richtige Weg, um mit syntaktischem Scala-Zucker über die Scala-Karte zu iterieren?

As
quelle

Antworten:

72

foreachMethode erhält Tuple2[String, String]als Argument, nicht 2 Argumente. Sie können es also entweder wie ein Tupel verwenden:

attrs.foreach {keyVal => println(keyVal._1 + "=" + keyVal._2)}

oder Sie können Muster übereinstimmen lassen:

attrs.foreach {case(key, value) => ...}
Tenshi
quelle
6
Schauen Sie sich Rex 'Antwort an, bessere Optionen dort
iwein
156

Drei Optionen:

attrs.foreach( kv => ... )          // kv._1 is the key, kv._2 is the value
attrs.foreach{ case (k,v) => ... }  // k is the key, v is the value
for ((k,v) <- attrs) { ... }        // k is the key, v is the value

Der Trick besteht darin, dass Sie durch Iteration Schlüssel-Wert-Paare erhalten, die Sie ohne Verwendung von caseoder nicht in einen Schlüssel- und Wert-ID-Namen aufteilen können for.

Rex Kerr
quelle
1

Ich habe einige weitere Möglichkeiten zum Iterieren von Kartenwerten hinzugefügt.

// Traversing a Map
  def printMapValue(map: collection.mutable.Map[String, String]): Unit = {

    // foreach and tuples
    map.foreach( mapValue => println(mapValue._1 +" : "+ mapValue._2))

    // foreach and case
    map.foreach{ case (key, value) => println(s"$key : $value") }

    // for loop
    for ((key,value) <- map) println(s"$key : $value")

    // using keys
    map.keys.foreach( key => println(key + " : "+map.get(key)))

    // using values
    map.values.foreach( value => println(value))
  }
Ranga Reddy
quelle