Remover várias chaves do mapa de maneira eficiente?

124

Tenho um Map<String,String>com grande número de pares de valores-chave. Agora eu quero remover as chaves selecionadas disso Map. O código a seguir mostra o que fiz para conseguir isso.

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

Então :

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

Isso está funcionando. Só quero saber qual seria a melhor maneira de cumprir meu requisito?

Ruchira Gayan Ranaweera
fonte

Respostas:

241

Supondo que seu conjunto contenha as strings que deseja remover, você pode usar o keySetmétodo e map.keySet().removeAll(keySet);.

keySetretorna uma visualização Set das chaves contidas neste mapa. O conjunto é apoiado pelo mapa, portanto, as alterações no mapa são refletidas no conjunto e vice-versa.

Exemplo artificial:

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"
assilias
fonte
sua sugestão é ótima. Acho que removeAll (keySet) está fazendo o que eu fiz lá
Ruchira Gayan Ranaweera
11
em termos de "eficiência", é provavelmente apenas um loop for por baixo, mas em termos de código mais limpo, boa vitória :)
rogerdpack
3

Apenas por uma questão de integridade:

Como adivinhado, java.util.AbstractSet#removeAllrealmente itera sobre todas as entradas, mas com um pequeno truque: ele usa o iterador da coleção menor:

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
fonte
1

Usando o fluxo Java:

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