有人能解释为什么我得到concurrentmodificationexception吗

k97glaaz  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(429)

这个问题在这里已经有答案了

为什么抛出concurrentmodificationexception以及如何调试它(8个答案)
13天前关门了。
根据docs concurrentmodificationexception状态:当一个对象在不允许的情况下被同时修改时,concurrentmodificationexception发生。
我正试着去我的java大脑生 rust ,做一个哈夫曼压缩下巴。我有一个助手函数可能导致了这个?当我传入root并将其设置为huffmanhelper返回的新根时
(我的代码可能还没有达到我想要的效果,我不需要帮助处理哈夫曼的东西或者我的bigo崩溃)我的question:i我只是好奇为什么我现在做的是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; 
        }   
}

我的堆栈跟踪:

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
lg40wkob

lg40wkob1#

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

node nextFrequent = nodePQ.poll();

它发生在一个循环中,循环遍历同一优先级队列,因此被视为禁止的并发修改。这会导致您的异常。
有没有更好的方法可以考虑迭代priorityqueue来删除项目?只是一个普通的for循环w pq.size()?
如果要按优先级顺序耗尽队列,请一直取出元素,直到 poll() 退货 null (未测试代码):

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

这个 poll 方法检索并删除此队列的头,或返回 null 如果此队列为空。
文档链接: Queue.poll()

相关问题