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*/ )

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.


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

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ść).


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.