Как проверить, существует ли ключ или значение на карте?

87

У меня есть карта scala, и я хотел бы проверить, существует ли на ней определенное значение.

myMap.exists( /*What should go here*/ )
Набег
источник

Ответы:

141

Есть несколько разных вариантов, в зависимости от того, что вы имеете в виду.

Если вы имеете в виду пару " ключ-значение " "значение" , вы можете использовать что-то вроде

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

Если вы имеете в виду значение пары "ключ-значение" , вы можете

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

Если вы хотите просто проверить ключ пары "ключ-значение" , тогда

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

Обратите внимание, что хотя формы кортежей (например _._1 == "fish") в конечном итоге оказываются короче, более длинные формы более четко определяют, что вы хотите, чтобы произошло.

Рекс Керр
источник
13
Также стоит сказать, что для проверки наличия ключа в библиотеке есть myMap.contains («рыба»)
Дэйв Гриффит
2
@DaveGriffith - Верно. Я просто использовал "существует", но это достаточно важно (так как это тот, который вы должны использовать), чтобы добавить его. Я изменил ответ соответствующим образом.
Рекс Керр
25

Вы хотите знать, существует ли значение на карте или ключ? Если вы хотите проверить ключ, используйте isDefinedAt:

myMap isDefinedAt key
Дэниел С. Собрал
источник
9

вы предоставляете тест, который проходит одно из значений карты, т.е.

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 говорится о методе «Проверяет, выполняется ли предикат для некоторых элементов этой неизменяемой карты». Загвоздка в том, что он получает кортеж (ключ, значение) вместо двух параметров.

Ilcavero
источник
6

Как насчет этого:

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

Урожайность, trueесли карта содержит cзначение.

Если вы настаиваете на использовании exists:

map.exists({case(_, value) => value == 'c'})
Томаш Нуркевич
источник
2
valuesсоздает новый, Iterableтак что вам, вероятно, будет лучше map.valuesIterator.contains('c')(хотя это не так просто map.exists(_._2 == 'c')!)
Луиджи Плиндж
3

В ответах выше обратите внимание, что exists () значительно медленнее, чем contains () (я сравнивал с картой, содержащей 5000 строковых ключей, и соотношение было постоянным x100). Я относительно новичок в scala, но я предполагаю, что существует () итерация по всем ключам (или ключ, значение tupple), тогда как содержит использует произвольный доступ карты

rpeleg
источник