Harita'da anahtar veya değer olup olmadığı nasıl kontrol edilir?


88

Bir ölçek haritam var ve haritada belirli bir değer olup olmadığını test etmek istiyorum.

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

Yanıtlar:


143

Ne demek istediğine bağlı olarak birkaç farklı seçenek var.

"Değer" anahtar / değer çifti ile kastediyorsanız , şu gibi bir şey kullanabilirsiniz:

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

Anahtar / değer çiftinin değerini kastediyorsanız , şunları yapabilirsiniz:

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

Yalnızca anahtar / değer çiftinin anahtarını test etmek istiyorsanız ,

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

Demet formlarının (örneğin _._1 == "fish") daha kısa olmasına rağmen, biraz daha uzun formların olmasını istediğiniz şey hakkında daha açık olduğunu unutmayın.


13
Ayrıca bir anahtarın varlığını test etmek için kütüphanenin myMap.contains ("balık") sağladığını söylemeye değer
Dave Griffith

2
@DaveGriffith - Gerçekten. Ben sadece "var" ı kullanıyordum, ama bu ( kullanmanız gereken şey olduğu için ) eklemek için yeterince önemli . Cevabı buna göre değiştirdim.
Rex Kerr

26

Değerin haritada veya anahtar üzerinde olup olmadığını bilmek ister misiniz ? Anahtarı kontrol etmek istiyorsanız, şunu kullanın isDefinedAt:

myMap isDefinedAt key

9

harita değerlerinden birinin geçeceği bir test sağlarsınız, örn.

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, "Bir yüklemin bu değişmez haritanın bazı öğeleri için geçerli olup olmadığını test eder." Yöntemini söyler, yakalama, iki parametre yerine bir demet (anahtar, değer) almasıdır.


6

Peki buna ne dersin:

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

trueHarita içeriyorsa verimc değerini.

Kullanmakta ısrar ediyorsanız exists:

map.exists({case(_, value) => value == 'c'})

2
valuesyeni bir tane yaratır, Iterablebu yüzden muhtemelen daha iyi map.valuesIterator.contains('c')map.exists(_._2 == 'c')
durumdasınız

3

Yukarıdaki yanıtlara göre, var () öğesinin contains () değerinden önemli ölçüde daha yavaş olduğuna dikkat edin (5000 dize anahtarı içeren bir Harita ile karşılaştırmalı değerlendirme yaptım ve oran tutarlı bir x100 idi). Ölçekleme konusunda nispeten yeniyim ama tahminim var () tüm anahtarlar (veya anahtar, değer tupple) üzerinde yineleniyor, oysa içerir Map'in rastgele erişimini kullanıyor

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.