Mam mapę scala i chciałbym sprawdzić, czy na mapie istnieje określona wartość.
myMap.exists( /*What should go here*/ )
Odpowiedzi:
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.
Chcesz wiedzieć, czy wartość istnieje na mapie, czy klucz? Jeśli chcesz sprawdzić klucz, użyj isDefinedAt
:
myMap isDefinedAt key
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ść).
A co z tym:
val map = Map(1 -> 'a', 2 -> 'b', 4 -> 'd')
map.values.toSeq.contains('c') //false
Zyski, true
jeśli mapa zawiera c
wartość.
Jeśli nalegasz na używanie exists
:
map.exists({case(_, value) => value == 'c'})
values
tworzy nowy, Iterable
więc prawdopodobnie lepiej ci będzie z map.valuesIterator.contains('c')
(chociaż to nie jest tak proste map.exists(_._2 == 'c')
!)
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