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
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 poll
método Recupera e remove o topo desta fila, ou retorna null
se 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.
deixe-me dizer algumas palavras