Як перевірити, чи існує ключ або значення в Map?


87

У мене є карта масштабу і я хотів би перевірити, чи існує на карті певне значення.

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 кажуть про метод "Тестує, чи відповідає предикат для деяких елементів цієї незмінної карти.", Фішка полягає в тому, що він отримує кортеж (ключ, значення) замість двох параметрів.


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

Згідно з наведеними вище відповідями, зауважте, що існує () значно повільніше, ніж містить () (я тестував карту, що містить 5000 рядкових ключів, і співвідношення було стабільним x100). Я відносно новачок у Scala, але, припускаю, існує () перебирає всі ключі (або ключ, значення tupple), тоді як містить випадковий доступ Map

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.