Bagaimana cara memeriksa apakah kunci atau nilai ada di Peta?

88

Saya memiliki Peta skala dan ingin menguji apakah ada nilai tertentu di peta.

myMap.exists( /*What should go here*/ )
Nabegh
sumber

Jawaban:

143

Ada beberapa opsi berbeda, tergantung apa yang Anda maksud.

Jika yang Anda maksud dengan pasangan kunci-nilai "nilai" , Anda dapat menggunakan sesuatu seperti

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

Jika yang Anda maksud adalah nilai key-value pair , maka Anda bisa

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

Jika Anda hanya ingin menguji kunci dari pasangan nilai kunci , maka

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

Perhatikan bahwa meskipun bentuk tupel (mis. _._1 == "fish") Menjadi lebih pendek, bentuk yang sedikit lebih panjang lebih eksplisit tentang apa yang Anda inginkan terjadi.

Rex Kerr
sumber
13
Juga perlu dikatakan bahwa untuk menguji keberadaan kunci, pustaka menyediakan myMap.contains ("fish")
Dave Griffith
2
@DaveGriffith - Memang. Saya baru saja menggunakan "ada", tapi yang satu itu cukup penting (karena itulah yang harus Anda gunakan) untuk ditambahkan. Saya telah mengubah jawabannya.
Rex Kerr
26

Apakah Anda ingin tahu apakah nilai tersebut ada di peta, atau kuncinya? Jika Anda ingin memeriksa kunci, gunakan isDefinedAt:

myMap isDefinedAt key
Daniel C. Sobral
sumber
9

Anda memberikan tes bahwa salah satu nilai peta akan lulus, yaitu

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 mengatakan tentang metode "Menguji apakah predikat berlaku untuk beberapa elemen dari peta yang tidak dapat diubah ini.", Tangkapannya adalah ia menerima tupel (kunci, nilai) alih-alih dua parameter.

ilcavero
sumber
6

Bagaimana dengan ini:

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

Menghasilkan truejika peta berisi cnilai.

Jika Anda bersikeras menggunakan exists:

map.exists({case(_, value) => value == 'c'})
Tomasz Nurkiewicz
sumber
2
valuesmembuat yang baru Iterablesehingga Anda mungkin lebih baik map.valuesIterator.contains('c')(meskipun itu tidak semudah map.exists(_._2 == 'c')!)
Luigi Plinge
3

Per jawaban di atas, perhatikan bahwa ada () secara signifikan lebih lambat daripada berisi () (Saya telah membandingkan dengan Peta yang berisi 5000 kunci string, dan rasionya x100 yang konsisten). Saya relatif baru mengenal scala tetapi tebakan saya ada () iterasi atas semua kunci (atau kunci, nilai tupple) sedangkan berisi menggunakan akses acak Map

rpeleg.dll
sumber