java bits iterando e removendo de um mapa



java jdk (8)

Existe uma solução melhor?

Bem, há, definitivamente, uma maneira melhor de fazer isso em uma única instrução , mas isso depende da condição com base em quais elementos são removidos.

Por exemplo: remova todos os elementos em que value é teste e , em seguida, use abaixo:

map.values().removeAll(Collections.singleton("test"));

ATUALIZAÇÃO Isso pode ser feito em uma única linha usando a expressão Lambda no Java 8.

map.entrySet().removeIf(e-> <boolean expression> );

Eu sei que esta pergunta é muito antiga, mas não há nenhum mal em atualizar a melhor maneira de fazer as coisas :)

https://src-bin.com

Eu estava fazendo:

for (Object key : map.keySet())
    if (something)
        map.remove(key);

que jogou um ConcurrentModificationException, então eu mudei para:

for (Object key : new ArrayList<Object>(map.keySet()))
    if (something)
        map.remove(key);

isso e quaisquer outros procedimentos que modifiquem o mapa estão em blocos sincronizados.

Existe uma solução melhor?

se ninguém aparecer com uma solução melhor, primeiro dizer que não pega o carrapato;)


Answer #1

A partir do Java 8, você poderia fazer isso da seguinte maneira:

map.entrySet().removeIf(e -> <boolean expression>);

Answer #2

E isso deve funcionar também ..

ConcurrentMap<Integer, String> running = ... create and populate map

Set<Entry<Integer, String>> set = running.entrySet();    

for (Entry<Integer, String> entry : set)
{ 
  if (entry.getKey()>600000)
  {
    set.remove(entry);    
  }
}

Answer #3

Eu concordo com Paul Tomblin. Eu geralmente uso o iterador do conjunto de chaves e, em seguida, baseio minha condição fora do valor dessa chave:

Iterator<Integer> it = map.keySet().iterator();
while(it.hasNext()) {
    Integer key = it.next();
    Object val = map.get(key);
    if (val.shouldBeRemoved()) {
        it.remove();
    }
}

Answer #4

Talvez você possa percorrer o mapa procurando as chaves para removê-las e armazená-las em uma coleção separada. Em seguida, remova a coleção de chaves do mapa. Modificar o mapa enquanto iterar geralmente é desaprovado. Essa ideia pode ser suspeita se o mapa for muito grande.


Answer #5

Uma maneira alternativa e mais detalhada

List<SomeObject> toRemove = new ArrayList<SomeObject>();
for (SomeObject key: map.keySet()) {
    if (something) {
        toRemove.add(key);
    }
}

for (SomeObject key: toRemove) {
    map.remove(key);
}

Answer #6

Você precisa usar o Iterator para remover elementos com segurança enquanto percorre um mapa.


Answer #7

ConcurrentHashMap

Você pode usar java.util.concurrent.ConcurrentHashMap .

Ele implementa o ConcurrentMap (que estende a interface Map ).

Por exemplo :

Map<Object, Content> map = new ConcurrentHashMap<Object, Content>();

for (Object key : map.keySet()) {
    if (something) {
        map.remove(key);
    }
}

Essa abordagem deixa seu código intocado. Apenas o tipo de map é diferente.





java