У меня есть карта scala, и я хотел бы проверить, существует ли на ней определенное значение.
myMap.exists( /*What should go here*/ )
Ответы:
Есть несколько разных вариантов, в зависимости от того, что вы имеете в виду.
Если вы имеете в виду пару " ключ-значение " "значение" , вы можете использовать что-то вроде
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"
) в конечном итоге оказываются короче, более длинные формы более четко определяют, что вы хотите, чтобы произошло.
Вы хотите знать, существует ли значение на карте или ключ? Если вы хотите проверить ключ, используйте isDefinedAt
:
myMap isDefinedAt key
вы предоставляете тест, который проходит одно из значений карты, т.е.
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 говорится о методе «Проверяет, выполняется ли предикат для некоторых элементов этой неизменяемой карты». Загвоздка в том, что он получает кортеж (ключ, значение) вместо двух параметров.
Как насчет этого:
val map = Map(1 -> 'a', 2 -> 'b', 4 -> 'd')
map.values.toSeq.contains('c') //false
Урожайность, true
если карта содержит c
значение.
Если вы настаиваете на использовании exists
:
map.exists({case(_, value) => value == 'c'})
values
создает новый, Iterable
так что вам, вероятно, будет лучше map.valuesIterator.contains('c')
(хотя это не так просто map.exists(_._2 == 'c')
!)
В ответах выше обратите внимание, что exists () значительно медленнее, чем contains () (я сравнивал с картой, содержащей 5000 строковых ключей, и соотношение было постоянным x100). Я относительно новичок в scala, но я предполагаю, что существует () итерация по всем ключам (или ключ, значение tupple), тогда как содержит использует произвольный доступ карты