ลบคีย์หลายรายการออกจากแผนที่อย่างมีประสิทธิภาพ?


124

ฉันมีMap<String,String>คู่ค่าคีย์จำนวนมาก ตอนนี้ฉันต้องการลบคีย์ที่เลือกออกจากสิ่งMapนั้น รหัสต่อไปนี้แสดงสิ่งที่ฉันทำเพื่อให้บรรลุเป้าหมายนั้น

Set keySet = new HashSet(); //I added keys to keySet which I want to remove. 

จากนั้น:

Iterator entriesIterator = keySet.iterator();
while (entriesIterator.hasNext()) {
   map.remove( entriesIterator.next().toString());
} 

นี่คือการทำงาน ฉันแค่อยากรู้ว่าอะไรจะเป็นวิธีที่ดีกว่าในการบรรลุความต้องการของฉัน?

คำตอบ:


241

สมมติว่าชุดของคุณมีสายที่คุณต้องการลบคุณสามารถใช้วิธีการและkeySetmap.keySet().removeAll(keySet);

keySetส่งคืนมุมมองชุดของคีย์ที่มีอยู่ในแผนที่นี้ ชุดนี้ได้รับการสนับสนุนจากแผนที่ดังนั้นการเปลี่ยนแปลงในแผนที่จะแสดงในชุดและในทางกลับกัน

ตัวอย่างที่สร้างขึ้น:

Map<String, String> map = new HashMap<>();
map.put("a", "");
map.put("b", "");
map.put("c", "");

Set<String> set = new HashSet<> ();
set.add("a");
set.add("b");

map.keySet().removeAll(set);

System.out.println(map); //only contains "c"

ข้อเสนอแนะของคุณดีมาก ฉันเดาว่า RemoveAll (keySet) กำลังทำในสิ่งที่ฉันทำที่นั่น
รุจิรากายานรา ณ วีระ

11
ในแง่ของ "ประสิทธิภาพ" มันอาจเป็นเพียงสำหรับลูปที่อยู่ข้างใต้ แต่ในแง่ของรหัสที่สะอาดกว่าชนะดี :)
rogerdpack

3

เพียงเพื่อความสมบูรณ์:

ตามที่เดาไว้java.util.AbstractSet#removeAllจะวนซ้ำทุกรายการ แต่มีเคล็ดลับเล็กน้อย: ใช้ตัววนซ้ำของคอลเลกชันขนาดเล็ก:

if (size() <= collection.size()) {
    Iterator<?> it = iterator();
    while (it.hasNext()) {
        if (collection.contains(it.next())) {
            it.remove();
        }
    }
} else {
    Iterator<?> it = collection.iterator();
    while (it.hasNext()) {
        remove(it.next());
    }
}

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