ฉันมีแผนที่สกาลาและต้องการทดสอบว่ามีค่าใดอยู่ในแผนที่หรือไม่
myMap.exists( /*What should go here*/ )
ฉันมีแผนที่สกาลาและต้องการทดสอบว่ามีค่าใดอยู่ในแผนที่หรือไม่
myMap.exists( /*What should go here*/ )
คำตอบ:
มีหลายตัวเลือกขึ้นอยู่กับความหมายของคุณ
หากคุณหมายถึงคู่คีย์ - ค่า "value" คุณสามารถใช้สิ่งต่างๆเช่น
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"
) จะสั้นลง แต่รูปแบบที่ยาวกว่าเล็กน้อยก็มีความชัดเจนมากขึ้นเกี่ยวกับสิ่งที่คุณต้องการให้เกิดขึ้น
คุณต้องการทราบว่ามีค่าอยู่บนแผนที่หรือไม่? หากคุณต้องการตรวจสอบคีย์ให้ใช้isDefinedAt
:
myMap isDefinedAt key
คุณให้การทดสอบว่าค่าใดค่าหนึ่งของแผนที่จะผ่านนั่นคือ
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 กล่าวถึงวิธีการ "ทดสอบว่าเพรดิเคตเก็บองค์ประกอบบางส่วนของแผนที่ที่ไม่เปลี่ยนรูปนี้หรือไม่" สิ่งที่จับได้คือได้รับทูเปิล (คีย์ค่า) แทนที่จะเป็นสองพารามิเตอร์
แล้วสิ่งนี้:
val map = Map(1 -> 'a', 2 -> 'b', 4 -> 'd')
map.values.toSeq.contains('c') //false
ให้ผลtrue
ถ้าแผนที่มีc
ค่า
หากคุณยืนยันที่จะใช้exists
:
map.exists({case(_, value) => value == 'c'})
values
สร้างใหม่Iterable
ดังนั้นคุณอาจจะดีกว่าด้วยmap.valuesIterator.contains('c')
(แม้ว่าจะไม่ง่ายเหมือนmap.exists(_._2 == 'c')
!)
ตามคำตอบด้านบนโปรดทราบว่ามีอยู่ () ช้ากว่ามี () อย่างมาก (ฉันเปรียบเทียบกับแผนที่ที่มีคีย์สตริง 5,000 คีย์และอัตราส่วนคือ x100 ที่สอดคล้องกัน) ฉันค่อนข้างใหม่สำหรับสกาล่า แต่การคาดเดาของฉันมีอยู่ () กำลังทำซ้ำบนคีย์ทั้งหมด (หรือคีย์ค่า tupple) ในขณะที่มีการใช้การเข้าถึงแบบสุ่มของแผนที่