Jak sprawdzić, czy klucz lub wartość istnieje w Mapie?

87

Mam mapę scala i chciałbym sprawdzić, czy na mapie istnieje określona wartość.

myMap.exists( /*What should go here*/ )
Nabegh
źródło

Odpowiedzi:

141

W zależności od tego, co masz na myśli, istnieje kilka różnych opcji.

Jeśli masz na myśli parę klucz-wartość „wartość” , możesz użyć czegoś takiego jak

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

Jeśli masz na myśli wartość pary klucz-wartość , możesz

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

Jeśli chcesz po prostu przetestować klucz z pary klucz-wartość , to

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

Zwróć uwagę, że chociaż formy krotek (np. _._1 == "fish") Są krótsze, nieco dłuższe formy są bardziej wyraźne na temat tego, co chcesz, aby się wydarzyło.

Rex Kerr
źródło
13
Warto również powiedzieć, że do testowania istnienia klucza biblioteka udostępnia myMap.contains ("fish")
Dave Griffith
2
@DaveGriffith - rzeczywiście. Po prostu użyłem „istnieje”, ale ten jest wystarczająco ważny (ponieważ jest to ten, którego powinieneś użyć), aby go dodać. Odpowiednio poprawiłem odpowiedź.
Rex Kerr
25

Chcesz wiedzieć, czy wartość istnieje na mapie, czy klucz? Jeśli chcesz sprawdzić klucz, użyj isDefinedAt:

myMap isDefinedAt key
Daniel C. Sobral
źródło
9

podajesz test, że jedna z wartości mapy przejdzie, tj

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

ScalaDocs mówi o metodzie „Testuje, czy predykat jest zachowany dla niektórych elementów tej niezmiennej mapy”. Połów jest taki, że zamiast dwóch parametrów otrzymuje krotkę (klucz, wartość).

ilcavero
źródło
6

A co z tym:

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

Zyski, truejeśli mapa zawiera cwartość.

Jeśli nalegasz na używanie exists:

map.exists({case(_, value) => value == 'c'})
Tomasz Nurkiewicz
źródło
2
valuestworzy nowy, Iterablewięc prawdopodobnie lepiej ci będzie z map.valuesIterator.contains('c')(chociaż to nie jest tak proste map.exists(_._2 == 'c')!)
Luigi Plinge
3

Zgodnie z powyższymi odpowiedziami, zauważ, że istnieje () jest znacznie wolniejszy niż zawiera () (porównałem z Mapą zawierającą 5000 kluczy ciągów, a stosunek był spójny x100). Jestem stosunkowo nowy w scali, ale przypuszczam, że istnieje () iteruje po wszystkich kluczach (lub klucz, krotka wartości), podczas gdy zawiera używa losowego dostępu Map

rpeleg
źródło