วิธีตรวจสอบว่ามีคีย์หรือค่าอยู่ในแผนที่หรือไม่


88

ฉันมีแผนที่สกาลาและต้องการทดสอบว่ามีค่าใดอยู่ในแผนที่หรือไม่

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

คำตอบ:


143

มีหลายตัวเลือกขึ้นอยู่กับความหมายของคุณ

หากคุณหมายถึงคู่คีย์ - ค่า "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") จะสั้นลง แต่รูปแบบที่ยาวกว่าเล็กน้อยก็มีความชัดเจนมากขึ้นเกี่ยวกับสิ่งที่คุณต้องการให้เกิดขึ้น


13
นอกจากนี้ยังควรบอกด้วยว่าสำหรับการทดสอบการมีอยู่ของคีย์ห้องสมุดมี myMap.contains ("fish")
Dave Griffith

2
@DaveGriffith - แน่นอน ฉันแค่ใช้ "มีอยู่" แต่สิ่งนั้นสำคัญพอ (เนื่องจากเป็นสิ่งที่คุณควรใช้) เพื่อเพิ่มฉันได้แก้ไขคำตอบตามนั้น
Rex Kerr

26

คุณต้องการทราบว่ามีค่าอยู่บนแผนที่หรือไม่? หากคุณต้องการตรวจสอบคีย์ให้ใช้isDefinedAt:

myMap isDefinedAt key

9

คุณให้การทดสอบว่าค่าใดค่าหนึ่งของแผนที่จะผ่านนั่นคือ

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 กล่าวถึงวิธีการ "ทดสอบว่าเพรดิเคตเก็บองค์ประกอบบางส่วนของแผนที่ที่ไม่เปลี่ยนรูปนี้หรือไม่" สิ่งที่จับได้คือได้รับทูเปิล (คีย์ค่า) แทนที่จะเป็นสองพารามิเตอร์


6

แล้วสิ่งนี้:

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

ให้ผลtrueถ้าแผนที่มีcค่า

หากคุณยืนยันที่จะใช้exists:

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

2
valuesสร้างใหม่Iterableดังนั้นคุณอาจจะดีกว่าด้วยmap.valuesIterator.contains('c')(แม้ว่าจะไม่ง่ายเหมือนmap.exists(_._2 == 'c')!)
Luigi Plinge

3

ตามคำตอบด้านบนโปรดทราบว่ามีอยู่ () ช้ากว่ามี () อย่างมาก (ฉันเปรียบเทียบกับแผนที่ที่มีคีย์สตริง 5,000 คีย์และอัตราส่วนคือ x100 ที่สอดคล้องกัน) ฉันค่อนข้างใหม่สำหรับสกาล่า แต่การคาดเดาของฉันมีอยู่ () กำลังทำซ้ำบนคีย์ทั้งหมด (หรือคีย์ค่า tupple) ในขณะที่มีการใช้การเข้าถึงแบบสุ่มของแผนที่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.