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*/ )

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.


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

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.


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'})

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.