Alguém pode explicar por que recebo ConcurrentModificationException

Slowly_Learning

De acordo com os documentos ConcurrentModificationException afirma: ConcurrentModificationException ocorre quando um objeto é tentado para ser modificado simultaneamente, quando isso não é permitido.

Estou tentando tirar a ferrugem do meu cérebro java e fazer uma mandíbula de compressão huffman. Tenho uma função auxiliar que provavelmente está causando isso? Quando eu passo o root e o configuro para o novo root que é retornado por huffmanHelper

( meu código provavelmente não está fazendo o que eu quero ainda, não preciso de ajuda com coisas do huffman ou uma análise do meu bigO ) Minha pergunta: Estou simplesmente curioso nos bastidores por que o que estou fazendo é um problema em java.

obrigada

package huffman;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Scanner;

public class huffman {

public static Map<Character, Integer> frequency = new HashMap<Character, Integer>();
public static PriorityQueue<node> nodesPQ = new PriorityQueue<node>();

public static void main(String[] args) {
    
    /* get input */
    Scanner scanner = new Scanner(System.in);
    String input = scanner.nextLine();
    frequency = inputFrequency(frequency,input);
    System.out.println(frequency);
    scanner.close();
    nodesPQ = createNodes(nodesPQ, frequency);
    node a = nodesPQ.poll();
    node b = nodesPQ.poll();
    node OGroot = new node(a,b,a.getFrequency() + b.getFrequency(),null);
    node finalRoot = createBranch(nodesPQ,OGroot);
    finalRoot.inorderPrint();
}


/* counts occurrences of letters in output returns Map<Char, # of occurrences> */
public static Map<Character,Integer> inputFrequency(Map<Character,Integer> map,String input){
    /* split input into char Array */
    char[] charsArray = input.toCharArray();
    
    /* fill hashmap ['Char', # of occurrences] */
    for(char i : charsArray) {
        int count = 0;                                                          
        for(char j : charsArray){
            if(i == j) {
             count++;            
            }
            map.put(i,count);                   
        }
    }
    return map;
}


/* take Map of <Character, # of occurrences> and create nodes inside PQ*/
public static PriorityQueue<node> createNodes(PriorityQueue<node> nodePQ,Map<Character,Integer> map){
            
        nodePQ = new PriorityQueue<>();  
        // create nodes inside PQ
        for (Map.Entry<Character,Integer> i : frequency.entrySet())  {
            Character character = i.getKey();
            Integer occurrences = i.getValue();
            node n = new node(null,null,occurrences,character);
            
                nodePQ.add(n);
            }        
      
        return nodePQ;
        } 


 



public static node createBranch(PriorityQueue<node> nodePQ, node root){
    node newRoot = null;
    for(node i : nodePQ) {
        node nextFrequent = nodePQ.poll();
        root = huffmanHelper(nodesPQ,root,nextFrequent);

    }
        return newRoot;
        
}
    





public static node huffmanHelper(PriorityQueue<node> nodePQ, node root, node nextFrequent){
    node newRoot = new node(nextFrequent,root,root.getFrequency() + nextFrequent.getFrequency(),null);
    
    //get next letter and frequency 
    return newRoot; 
        }   
}

meu rastreamento de pilha:

hello my name is sam
{ =4, a=2, s=2, e=2, h=1, y=1, i=1, l=2, m=3, n=1, o=1}
Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.PriorityQueue$Itr.next(PriorityQueue.java:536)
    at huffman.huffman.createBranch(huffman.java:83) - is the start of 
    forLoop in createBranch
    at huffman.huffman.main(huffman.java:26) - is node finalRoot = 
    createBranch(nodesPQ,OGroot); in main
Ole VV

Esta linha remove um elemento da fila de prioridade:

    node nextFrequent = nodePQ.poll();

Isso acontece dentro de um loop que itera sobre a mesma fila de prioridade, portanto, conta como uma modificação simultânea proibida. Isso causa sua exceção.

existe uma maneira melhor de iterar em uma PriorityQueue para remover itens? apenas um loop for regular w PQ.size ()?

Se você quiser esgotar a fila em ordem de prioridade, continue retirando os elementos até poll()retornar null(o código não é testado):

    node nextFrequent = nodePQ.poll();
    while (nextFrequent != null) {
        // Do something with nextFrequent
        nextFrequent = nodePQ.poll();
    }

O pollmétodo Recupera e remove o topo desta fila, ou retorna nullse esta fila estiver vazia.

Link de documentação: Queue.poll()

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Alguém pode explicar por que recebo essas saídas?

Alguém pode explicar por que recebo esse erro com os tipos?

Alguém pode explicar por que recebo essa saída em Python?

Alguém pode explicar por que precisamos escalar no SpriteKit?

Por que essa afirmação é falsa? Alguém pode explicar

Alguém pode explicar por que isso não funciona?

Se eu substituir "arr[index]" por "arr[items]" recebo um array com os valores de [2, 0, 3, 4], alguém pode explicar o que está acontecendo

Alguém pode explicar o que é maxBit?

Por que preciso dessas chaves aqui? Alguém pode me explicar por que isso acontece?

alguém pode explicar por que não consigo retornar um valor desse método?

Alguém pode me explicar por que esse segundo método não atualiza totalmente a string?

Alguém pode explicar por que GOPATH é conveniente e como deve ser usado em geral?

Alguém pode explicar por que meu enredo Python não mostra nada?

alguém pode explicar por que os links .asp apresentam comportamento estranho?

Alguém pode explicar por que a saída de True, True == (True, True) é (True, False)?

Alguém pode explicar por que 4 & 0xFFFF - 1 ainda é 4?

Alguém pode explicar por que essa maneira de iterar uma estrutura de dados aninhada funciona?

Alguém pode explicar por que meu programa não está mostrando o alerta correto?

Alguém pode me explicar por que o sub () / gsub () do awk funciona assim?

Alguém pode explicar por que as saídas são diferentes em C e Java?

Reatribuindo variável global em JavaScript - alguém pode me explicar por que currentAcc permanece indefinido

Alguém pode explicar por que essa função recursiva falha?

ReactJS - Alguém pode explicar como e por que esse estado está sendo alterado?

Alguém pode me explicar por que essa saída é dada?

Golang Alguém pode explicar por que a comparação de hash é falha

Alguém pode explicar por que o teste JUnit está dando um erro?

Alguém pode explicar por que meu loop for para no lugar errado

Alguém pode explicar por que MVC é superior à Arquitetura de Três Camadas?

Alguém pode explicar por que estou recebendo a falha de segmentação 11?