用 Priorityqueue 替换 LinkedList。显示的错误是 java.lang.ClassCastException

Posted

技术标签:

【中文标题】用 Priorityqueue 替换 LinkedList。显示的错误是 java.lang.ClassCastException【英文标题】:replacing LinkedList with Priorityqueue. the error showing is java.lang.ClassCastException 【发布时间】:2021-10-05 16:03:24 【问题描述】:

i have replaced the existing LinkedList with Priority queue which u can find in the image. and u can also find the error when i am running the loop

 public static void main(String[] args) 
    // TODO code application logic here
    Scanner input = new Scanner(System.in);
    int sel;
    PriorityQueue<Worker> userQueue = new PriorityQueue<>();
    PriorityQueue<String> users = new PriorityQueue<>();
    while(true)
    
        System.out.print("1) Add job\n2) Run Jobs\n3) Clear Jobs\n4) Add User\n5) Print users\n0) Exit\n");
        
        sel = getInteger(input);
        if (sel == 0)
        
            break;
        
        else if (sel == 1)
        
            System.out.print("1) Basic Job\n2) Repeating Job\n0) Cancel\n");
            sel = getInteger(input);
            if (sel == 1)
            
                System.out.println("Enter job message");
                String msg = input.nextLine();
                msg = input.nextLine();
                userQueue.offer(new Worker(msg)); 

// 我在 userQueue.offer(new Worker(msg)) 处遇到异常; //

Exception in thread "main" java.lang.ClassCastException: class cis265.Worker cannot be cast to class java.lang.Comparable (cis265.Worker is in module cis265_queue of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap')
    at java.base/java.util.PriorityQueue.siftUpComparable(PriorityQueue.java:643)
    at java.base/java.util.PriorityQueue.siftUp(PriorityQueue.java:639)
    at java.base/java.util.PriorityQueue.offer(PriorityQueue.java:330)
    at cis265_queue/cis265.Cis265_queue.main(Cis265_queue.java:63)

     

【问题讨论】:

请将您的代码显示为问题中的文本,如minimal reproducible example。 你还需要显示你得到的异常,并在代码中指出它发生的行。 【参考方案1】:

根本问题是您试图将某些东西放入一个订单中,而没有告诉 Java 该订单应该是什么。

见Javadoc:

依赖自然排序的优先级队列也不允许插入不可比较的对象(这样做可能会导致ClassCastException)。

所以,要么让你的Worker 实现Comparable,要么为PriorityQueue 的构造函数提供一个Comparator

【讨论】:

以上是关于用 Priorityqueue 替换 LinkedList。显示的错误是 java.lang.ClassCastException的主要内容,如果未能解决你的问题,请参考以下文章

6.4 Linked List 重做

为啥我不能将 PriorityQueue 存储到 MongoDB 中

Top K以及java priorityqueue

转:PriorityQueue

Linked List Start!

PriorityQueue底层原理