Eu tenho um código (Andorid) que percorre uma fila de prioridade e exclui todas as entradas com um id específico.
No entanto, elimina apenas a primeira instância e ignora o resto. Por exemplo,
(abc 1) (def 2) (ghi 3) (jkl 1) (mno 3)
Se o id fornecido for 1. Ele exclui apenas abc e a fila é reorganizada e deixa o jkl nela. Eu também cansei de iterador, mas não uso.
for(SomeMessage message : priorityQueue){
if(message.id == dead_sender.id){
priorityQueue.remove(message)
}
}
Respostas:
3 para resposta № 1Você não pode iterar a coleção em um loop for-each e excluir elementos dela ao fazer isso.
Você deve criar um conjunto separado para "itens a serem removidos" durante a iteração. Quando terminar, faça uma iteração sobre esse novo conjunto, excluindo cada item da coleção original.
Algo como:
List<SomeMessage> toRemove = new ArrayList<>();
for(SomeMessage message : priorityQueue){
if(message.id == dead_sender.id){
toRemove.add(message);
}
}
for (SomeMessage message : toRemove) {
priorityQueue.remove(message)
}
Observe, no entanto, que remover um elemento arbitrário (não o cabeçalho) de uma fila de prioridade é uma tarefa cara (O(n)
), e se isso se tornar um problema, talvez seja necessário alterar seu design para:
- Use um
TreeSet
ou uma estrutura de dados totalmente ordenada - Em vez de marcar quais itens remover, marque os itens a serem mantidos e, em vez de removê-los, crie um novo PriorityQueue com esses itens.