Tenho um scala Map e gostaria de testar se um determinado valor existe no mapa.
myMap.exists( /*What should go here*/ )
Respostas:
Existem várias opções diferentes, dependendo do que você quer dizer.
Se você quer dizer par de valores-chave "valor" , pode usar algo como
myMap.exists(_ == ("fish",3))
myMap.exists(_ == "fish" -> 3)
Se você quer dizer o valor do par de valores-chave , pode
myMap.values.exists(_ == 3)
myMap.exists(_._2 == 3)
Se você quiser apenas testar a chave do par de valores-chave ,
myMap.keySet.exists(_ == "fish")
myMap.exists(_._1 == "fish")
myMap.contains("fish")
Observe que, embora as formas de tupla (por exemplo _._1 == "fish"
) acabem sendo mais curtas, as formas um pouco mais longas são mais explícitas sobre o que você deseja que aconteça.
Você quer saber se o valor existe no mapa, ou a chave? Se você quiser verificar a chave, use isDefinedAt
:
myMap isDefinedAt key
você fornece um teste em que um dos valores do mapa passará, ou seja,
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
Os ScalaDocs dizem do método "Testa se um predicado é válido para alguns dos elementos deste mapa imutável.", O problema é que ele recebe uma tupla (chave, valor) em vez de dois parâmetros.
Que tal isso:
val map = Map(1 -> 'a', 2 -> 'b', 4 -> 'd')
map.values.toSeq.contains('c') //false
Rende true
se o mapa contiver c
valor.
Se você insiste em usar exists
:
map.exists({case(_, value) => value == 'c'})
values
cria um novo Iterable
para que você provavelmente map.valuesIterator.contains('c')
fique melhor (embora não seja tão fácil quanto map.exists(_._2 == 'c')
!)
De acordo com as respostas acima, observe que existe () é significativamente mais lento do que contém () (eu fiz benchmarking com um Mapa contendo 5000 chaves de string e a proporção era um x100 consistente). Sou relativamente novo em scala, mas acho que existe () está iterando em todas as chaves (ou chave, valor tupple), enquanto contém usa o acesso aleatório de Map