Hapus beberapa kunci dari Peta dengan cara yang efisien?


124

Saya memiliki sejumlah Map<String,String>besar pasangan nilai kunci. Sekarang saya ingin menghapus kunci yang dipilih dari itu Map. Kode berikut menunjukkan apa yang saya lakukan untuk mencapai itu.

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

Kemudian :

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

Ini bekerja. Saya hanya ingin tahu, cara apa yang lebih baik untuk memenuhi kebutuhan saya?

Jawaban:


241

Dengan asumsi set Anda berisi string yang ingin Anda hapus, Anda dapat menggunakan yang keySetmetode dan map.keySet().removeAll(keySet);.

keySetmengembalikan tampilan Set dari kunci yang terdapat dalam peta ini. Himpunan ini didukung oleh peta, sehingga perubahan pada peta tercermin dalam himpunan, dan sebaliknya.

Contoh yang dibuat-buat:

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"

saran Anda bagus. Saya kira removeAll (keySet) melakukan apa yang saya lakukan di sana
— Ruchira Gayan Ranaweera

11
dalam hal "efisiensi" ini mungkin hanya untuk loop di bawahnya, tetapi dalam hal kode yang lebih bersih, kemenangan yang bagus :)
— rogerdpack

3

Hanya demi kelengkapan:

Seperti yang ditebak java.util.AbstractSet#removeAllbenar-benar mengulangi semua entri, tetapi dengan satu trik kecil: Ini menggunakan iterator dari koleksi yang lebih kecil:

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());
    }
}

1

Menggunakan aliran Java:

keySet.forEach(map::remove);
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.