【问题标题】:Exception in thread "main" java.lang.ClassCastException: with priority queue and comparator线程“主”java.lang.ClassCastException 中的异常:具有优先级队列和比较器
【发布时间】:2016-11-23 09:20:24
【问题描述】:

这段代码有什么问题。我收到以下错误消息。

Exception in thread "main" java.lang.ClassCastException: Nodes cannot be cast to java.lang.Comparable
    at java.util.PriorityQueue.siftUpComparable(Unknown Source)
    at java.util.PriorityQueue.siftUp(Unknown Source)
    at java.util.PriorityQueue.offer(Unknown Source)
    at java.util.PriorityQueue.add(Unknown Source)

请帮忙

import java.util.Comparator;
import java.util.InputMismatchException;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Queue;

class Nodes implements Comparator<Nodes> {
        public int n;
        public int c;

        public Nodes() {
        }

        public Nodes(int n, int c) {
            this.n = n;
            this.c = c;
        }

        @Override
        public int compare(Nodes Nodes1, Nodes Nodes2) {
            if (Nodes1.c < Nodes2.c) {
                return -1;
            }
            if (Nodes1.c > Nodes2.c) {
                return 1;
            }
            return 0;
        }
    }
class dj
{ 
    public static void main(String[] args) {
Queue<Nodes> pq = new PriorityQueue<Nodes>();
    pq.add(new Nodes(5,4));
   pq.add(new Nodes(6,7));
   pq.add(new Nodes(7,6));
   pq.add(new Nodes(8,9));
   pq.add(new Nodes(9,8));
   pq.add(new Nodes(8,8));  

    }
}

【问题讨论】:

  • 你可能需要实现 Comparable,而不是 Comparator
  • 并提示:这里要学习的真正内容:学习阅读异常消息——它们准确地告诉你发生了什么!这是学习编程时的一件大事:您必须注意“Comparator”与“Comparable”不同的微妙细节。

标签: java priority-queue comparator compareto


【解决方案1】:

您收到此错误是因为您实现了错误的接口。

你需要的是

class Nodes implements Comparable<Nodes>

这表明 Nodes 类可以与其他 Nodes 进行比较。 这是在 PriorityQueue 中使用它所需要的。

Comparator 是一个比较对象的类,即使它们自己没有实现 Comparable。它通常可以传递给特定的排序函数,并且通常独立于 Class 本身(您可以拥有多个具有不同逻辑的 Comparator)

有关更多信息,请参阅 2 个类的 JavaDoc:

https://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html
https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html

【讨论】:

  • 为了让您的答案完美,您可以自己放入 Javadoc 链接 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多