Wie überprüfe ich, ob Schlüssel oder Wert in Map vorhanden sind?

87

Ich habe eine Scala-Karte und möchte testen, ob ein bestimmter Wert in der Karte vorhanden ist.

myMap.exists( /*What should go here*/ )
Nabegh
quelle

Antworten:

140

Es gibt verschiedene Möglichkeiten, je nachdem, was Sie meinen.

Wenn Sie mit "Wert" Schlüssel-Wert-Paar meinen , können Sie so etwas wie verwenden

myMap.exists(_ == ("fish",3))
myMap.exists(_ == "fish" -> 3)

Wenn Sie den Wert des Schlüssel-Wert-Paares meinen , können Sie dies

myMap.values.exists(_ == 3)
myMap.exists(_._2 == 3)

Wenn Sie nur den Schlüssel des Schlüssel-Wert-Paares testen möchten , dann

myMap.keySet.exists(_ == "fish")
myMap.exists(_._1 == "fish")
myMap.contains("fish")

Beachten Sie, dass die Tupelformulare (z. B. _._1 == "fish") zwar kürzer sind, die etwas längeren Formulare jedoch expliziter angeben, was geschehen soll.

Rex Kerr
quelle
13
Erwähnenswert ist auch, dass die Bibliothek zum Testen der Existenz eines Schlüssels myMap.contains ("fish") bereitstellt
Dave Griffith
2
@ DaveGriffith - In der Tat. Ich habe nur "existiert" verwendet, aber das ist wichtig genug (da es das ist, das Sie verwenden sollten ), um es hinzuzufügen. Ich habe die Antwort entsprechend geändert.
Rex Kerr
24

Möchten Sie wissen, ob der Wert auf der Karte oder auf dem Schlüssel vorhanden ist? Wenn Sie den Schlüssel überprüfen möchten, verwenden Sie isDefinedAt:

myMap isDefinedAt key
Daniel C. Sobral
quelle
9

Sie stellen einen Test bereit, bei dem einer der Kartenwerte bestanden wird, d. h

val mymap = Map(9->"lolo", 7->"lala")
mymap.exists(_._1 == 7) //true
mymap.exists(x => x._1 == 7 && x._2 == "lolo") //false
mymap.exists(x => x._1 == 7 && x._2 == "lala") //true

Die ScalaDocs sagen über die Methode "Testet, ob ein Prädikat für einige der Elemente dieser unveränderlichen Karte gilt." Der Haken ist, dass es anstelle von zwei Parametern ein Tupel (Schlüssel, Wert) empfängt.

ilcavero
quelle
6

Was ist damit:

val map = Map(1 -> 'a', 2 -> 'b', 4 -> 'd')
map.values.toSeq.contains('c')  //false

Ergibt, truewenn die Karte einen cWert enthält .

Wenn Sie darauf bestehen, Folgendes zu verwenden exists:

map.exists({case(_, value) => value == 'c'})
Tomasz Nurkiewicz
quelle
2
valueserstellt eine neue, Iterableso dass Sie wahrscheinlich besser dran sind map.valuesIterator.contains('c')(obwohl das nicht so einfach ist wie map.exists(_._2 == 'c')!)
Luigi Plinge
3

Beachten Sie gemäß den obigen Antworten, dass exist () erheblich langsamer ist als enthält () (ich habe ein Benchmarking mit einer Map durchgeführt, die 5000 Zeichenfolgenschlüssel enthält, und das Verhältnis war ein konsistentes x100). Ich bin relativ neu in Scala, aber meine Vermutung ist vorhanden () iteriert über alle Schlüssel (oder Schlüssel, Wertetupple), während der zufällige Zugriff von Map verwendet wird

rpeleg
quelle