/ / Exclusão na Fila de Prioridade - java, android, estruturas de dados

Exclusão na Fila Prioritária - java, android, estruturas de dados

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

Você 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:

  1. Use um TreeSet ou uma estrutura de dados totalmente ordenada
  2. 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.