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.