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

72

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

<code>myMap.exists( /*What should go here*/ )
</code>

Ваш Ответ

5   ответов
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'})
values создает новыйIterable так что вы, вероятно, лучше сmap.valuesIterator.contains('c') (хотя это не так просто, какmap.exists(_._2 == 'c')!)
114

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

Если вы имеете в виду под «значением»key-value pairтогда вы можете использовать что-то вроде

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

Если ты имеешь ввидуvalue of the key-value pair, тогда ты можешь

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

Если вы хотите просто проверитьthe key of the key-value pair, затем

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

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

@DaveGriffith - Действительно. Я просто использовал «существует», но это достаточно важно (так как это тот, который выshould используйте), чтобы добавить. Я соответственно изменил ответ.
Также стоит отметить, что для проверки существования ключа библиотека предоставляет myMap.contains (& quot; fish & quot;)
0

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

17

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

Похожие вопросы