Java 有人能解释我为什么会得到ConcurrentModificationException吗

Java 有人能解释我为什么会得到ConcurrentModificationException吗,java,exception,huffman-code,concurrentmodification,Java,Exception,Huffman Code,Concurrentmodification,根据文件ConcurrentModificationException状态: ConcurrentModificationException在不允许同时修改对象时发生 我正试着去腐蚀我的java大脑,做一个哈夫曼压缩下巴。 我有一个助手函数,它可能导致了这个问题?当我传入root并将其设置为huffmanHelper返回的新根时 我的代码可能还没有达到我想要的效果,我不需要哈夫曼的帮助,也不需要我的bigO崩溃 我的问题:我只是想知道为什么我所做的是java中的一个问题 多谢各位 package

根据文件ConcurrentModificationException状态: ConcurrentModificationException在不允许同时修改对象时发生

我正试着去腐蚀我的java大脑,做一个哈夫曼压缩下巴。 我有一个助手函数,它可能导致了这个问题?当我传入root并将其设置为huffmanHelper返回的新根时

我的代码可能还没有达到我想要的效果,我不需要哈夫曼的帮助,也不需要我的bigO崩溃 我的问题:我只是想知道为什么我所做的是java中的一个问题

多谢各位

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; 
        }   
}

此行从优先级队列中删除一个元素:

    node nextFrequent = nodePQ.poll();
它发生在循环内,循环遍历同一优先级队列,因此被视为禁止的并发修改。这会导致您的异常

有没有更好的方法可以考虑迭代PriorityQueue 要删除项目吗?只是一个常规的循环w PQ.size

如果要按优先级顺序耗尽队列,请继续取出元素,直到未测试poll返回空代码:

    node nextFrequent = nodePQ.poll();
    while (nextFrequent != null) {
        // Do something with nextFrequent
        nextFrequent = nodePQ.poll();
    }
poll方法检索并删除此队列的头,如果此队列为空,则返回null


文档链接:

如果出现错误,请显示实际错误。这意味着显示堆栈跟踪并解释它映射到[mcve]代码的哪一部分,而不仅仅是给出它的名称和描述:因为不需要运行代码。作为一个新用户:欢迎使用Stackoverflow,然后相应地编辑您的帖子。如果您努力遵循=堆栈跟踪指出错误发生在代码的哪一行,我们将尽力提供帮助。让我们从:不,不是,因为它说错误在第26行,而您粘贴的代码在第26行有一个空行。这是一个堆栈跟踪,但不适用于此代码,因此请确保减少您的代码,以便将其放入帖子,然后显示该代码的堆栈跟踪:不要显示不同代码的堆栈跟踪。另外,请记住在代码编辑器/IDE中自动设置代码格式,因为没有人喜欢阅读带有大量空行的奇怪甚至是不匹配的缩进代码。如果您试图消除Java大脑的锈迹,使用代码约定进行命名和格式化是一个很好的开始。谢谢,简单,切中要害,非常感谢您的帮助,但不是很好。Ole V.V.V.V有没有更好的方法可以考虑迭代PriorityQueue来删除项目?只是一个常规的for循环w PQ.size?感谢您的帮助,我通过如下更改createBranch函数来解决此问题:公共静态节点createBranchPriorityQueue nodePQ,节点根{forint I=0;I node nextFrequent = nodePQ.poll(); while (nextFrequent != null) { // Do something with nextFrequent nextFrequent = nodePQ.poll(); }