无法转换为 java.lang.Comparable

新手上路,请多包涵

虽然这个问题已经被问到,但我有一个具体实施的疑问。

我正在尝试打印二叉树的顶视图,下面是它的完整代码:

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

它编译得很好,但在运行时会引发异常。现在我得到了以下异常,我无法弄清楚问题是什么:

 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)

原文由 pkenil96 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 562
2 个回答

这是因为 Pair 没有实现 Comparable。要么实施它:

 public class Pair implements Comparable<Pair> {
    public int compareTo(Pair o) {
        // ...
    }
}

或者在您的优先级队列中使用 Comparator

使用比较器;

 PriorityQueue<DummyObject> pq = new
             PriorityQueue<DummyObject>(5, new DummyObjectComparator());

定义你的比较器:

 class DummyObjectComparator implements Comparator<DummyObject>{

      // Overriding compare()method of Comparator

       public int compare(DummyObject s1, DummyObject s2) {
                   //some code
       }
 }

原文由 gati sahu 发布,翻译遵循 CC BY-SA 4.0 许可协议

您正在尝试添加 Pair Pair PriorityQueue Comparable 一个合理的实现可能是强制 FSComparable 对他们自己的权利:,然后比较第二个元素:

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

原文由 Mureinik 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题