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?

Ruchira Gayan Ranaweera
sumber

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"
assylias
sumber
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());
    }
}
Sebastian
sumber
1

Menggunakan aliran Java:

keySet.forEach(map::remove);
Abdull
sumber