[英]cannot cast to java.lang.Comparable
Although this question has already been asked but I have an implementation specific doubt.虽然已经问过这个问题,但我有一个具体的实施疑问。
I am trying to print the top view of the binary tree and following is the complete code for it:我正在尝试打印二叉树的顶视图,以下是它的完整代码:
import java.util.*;
class Node{
int data;
Node right;
Node left;
Node(int data){
this.data = data;
}
}
class Pair<F,S>{
private F first;
private S second;
public Pair(F first, S second){
this.first = first;
this.second = second;
}
public F getFirst(){return first;}
public S getSecond(){return second;}
}
class BinaryTreeTopView{
public static void printTopView(Node root){
if(root == null)
return;
Queue <Pair<Node,Integer>> q = new Queue<>();
Map <Integer,Node> map = new HashMap<>();
Pair<Node,Integer> p = new Pair<>(root, 0);
q.add(p);
/*
I am storing nodes and the corresponding horizontal distances
in the form of a pair which then are being stored in the queue
to ensure level order traversal
*/
while(!q.isEmpty()){
Pair<Node,Integer> temp = q.peek();
q.remove();
if(map.containsKey(temp.getSecond())==true){
map.put(temp.getSecond(),temp.getFirst());
} else {
System.out.println(temp.getFirst().data);
map.put(temp.getSecond(),temp.getFirst());
}
if(temp.getFirst().left!=null){
Pair<Node,Integer> left = new Pair<>(temp.getFirst().left, temp.getSecond()-1);
q.add(left);
}
if(temp.getFirst().right!=null){
Pair<Node,Integer> right = new Pair<> (temp.getFirst().right, temp.getSecond()+1);
q.add(right);
}
}
}
public static void main(String[] args) {
Node root = new Node(1);
root.left = new Node(2);
root.right = new Node(3);
root.left.right = new Node(5);
root.left.left = new Node(4);
root.right.left = new Node(6);
root.right.right = new Node(7);
root.right.left.right = new Node(8);
root.right.right.left = new Node(10);
root.right.right.right = new Node(9);
root.right.right.left.right = new Node(11);
root.right.right.left.right.right = new Node(12);
printTopView(root);
}
}
It compiles fine but an exception is being raised at the runtime.它编译得很好,但在运行时引发了异常。 Now I have been getting the following exception and I am unable to figure out what the problem is:现在我得到了以下异常,我无法弄清楚问题是什么:
Exception in thread "main" java.lang.ClassCastException:
Pair cannot be cast to java.lang.Comparable at java.util.PriorityQueue.siftUpComparable(PriorityQueue.java:652)
at java.util.PriorityQueue.siftUp(PriorityQueue.java:647)
at java.util.PriorityQueue.offer(PriorityQueue.java:344)
at java.util.PriorityQueue.add(PriorityQueue.java:321)
It's because Pair isn't implementing Comparable.这是因为 Pair 没有实现 Comparable。 Either implement it:要么实现它:
public class Pair implements Comparable<Pair> {
public int compareTo(Pair o) {
// ...
}
}
Or use Comparator in Your priority queue或者在你的优先队列中使用 Comparator
Using Comparator ;使用比较器;
PriorityQueue<DummyObject> pq = new
PriorityQueue<DummyObject>(5, new DummyObjectComparator());
Define your Comparator :定义你的比较器:
class DummyObjectComparator implements Comparator<DummyObject>{
// Overriding compare()method of Comparator
public int compare(DummyObject s1, DummyObject s2) {
//some code
}
}
You're trying to add Pair
instances to a PriorityQueue
, so your Pair
class must be Comparable
.您正在尝试将Pair
实例添加到PriorityQueue
,因此您的Pair
类必须是Comparable
。 A reasonable implementation could be to force F
and S
to be Comparable
on their own right, and then compare by the first element, and then the second one:一个合理的实现可能是强制F
和S
自己是可Comparable
,然后按第一个元素进行比较,然后是第二个:
class Pair<F extends Comparable<F>, S extends Comparable<S>>
implements Comparable<Pair<F, S>> {
// All the code you already have is fine
@Override
public int compareTo(Pair<F, S> o) {
int retVal = getFirst().compareTo(o.getFirst());
if (retVal != 0) {
return retVal;
}
return getSecond().compareTo(o.getSecond());
}
}
Your statement:你的声明:
Queue <Pair<Node,Integer>> q = new Queue<>();
Doesn't compile because Queue
is an interface and cannot be instantiated.无法编译,因为Queue
是一个接口并且无法实例化。 I suspect that you've used a PriorityQueue
instead.我怀疑您使用的是PriorityQueue
。
Do you really need a priority queue, or would a simple LinkedList
would suit your algoritm?你真的需要一个优先队列,还是一个简单的LinkedList
适合你的算法?
UPDATE:更新:
BTW, with a LinkedList
, the output is:顺便说一句,使用LinkedList
,输出为:
1 2 3 4 7 9 1 2 3 4 7 9
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.