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.