Haritadan birden çok anahtar verimli bir şekilde kaldırılsın mı?


124

Çok Map<String,String>sayıda anahtar değer çiftim var. Şimdi seçili anahtarları bundan kaldırmak istiyorum Map. Aşağıdaki kod, bunu başarmak için ne yaptığımı gösteriyor.

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

Sonra :

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

Bu çalışıyor. Sadece bilmek istiyorum, ihtiyacımı yerine getirmenin daha iyi bir yolu nedir?

Yanıtlar:


241

Kaldırmak istediğiniz dizeleri Setinizi içerdiği varsayılırsa, kullanabileceğiniz yöntemi ve .keySetmap.keySet().removeAll(keySet);

keySetbu haritada bulunan anahtarların Set görünümünü döndürür. Set, harita tarafından desteklenir, bu nedenle haritadaki değişiklikler sete yansıtılır ve bunun tersi de geçerlidir.

Yapmacık örnek:

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"

öneriniz harika. Sanırım removeAll (keySet) benim orada yaptığımı yapıyor
— Ruchira Gayan Ranaweera

11
"verimlilik" açısından bu muhtemelen altında sadece bir for döngüsü, ancak daha temiz kod açısından, güzel kazanç :)
— rogerdpack

3

Sırf eksiksizlik adına:

Tahmin java.util.AbstractSet#removeAlledildiği gibi, tüm girişleri gerçekten yineliyor, ancak küçük bir hile ile: Daha küçük koleksiyonun yineleyicisini kullanıyor:

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

Java akışını kullanma:

keySet.forEach(map::remove);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.