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.