3

我已经在这个程序上工作了几天,并且在我的 BinarySearchTree 类中实现了一些主要方法,例如插入和删除。插入似乎工作正常,但是一旦我尝试删除,我就会不断出错。因此,在玩弄了代码之后,我想测试我的 compareTo 方法。我创建了两个新节点并尝试比较它们,但出现此错误:

线程“主”java.lang.ClassCastException 中的异常:TreeNode 无法在 BinarySearchTree.myComparision 的 TreeNode.compareTo(TreeNode.java:16) 的 java.lang.Integer.compareTo(Unknown Source) 处转换​​为 java.lang.Integer( BinarySearchTree.java:177) 在 main.main(main.java:14)

这是我创建节点的类:

    public class TreeNode<T> implements Comparable
    {
        protected TreeNode<T> left, right;
        protected Object element;

    public TreeNode(Object obj)
    {
        element=obj;
        left=null;
        right=null;
    }

   public int compareTo(Object node)
   {
       return ((Comparable) this.element).compareTo(node);
   }

}

我做的 compareTo 方法都错了吗?我想创建可以处理整数和字符串的树(当然是单独的)

4

3 回答 3

4

为了确保element确实是一个可比较的对象,并避免所有的演员,你可以做这样的事情:

public class TreeNode<T extends Comparable<? super T>>
implements Comparable<TreeNode<T>> {

    protected TreeNode<T> left, right;
    protected T element;

    public TreeNode(T obj) {
        element = obj;
        left = null;
        right = null;
    }

    @Override
    public int compareTo(TreeNode<T> node) {
        return element.compareTo(node.element);
    }

}

对于一个使用示例:

TreeNode<Integer> node1 = new TreeNode<Integer>(2);
TreeNode<Integer> node2 = new TreeNode<Integer>(3);
System.out.println(node1.compareTo(node2));

上面的代码片段打印-1在控制台上。

于 2011-11-21T02:05:24.930 回答
2

尝试

public <T> int compareTo(Object node) 
{ 
    return ((Comparable) this.element).compareTo( ( TreeNode<T> ) node ).element); 
} 
于 2011-11-21T01:49:31.247 回答
2

compareTo 方法应用于 TreeNode(作为节点参数传递),同时将它与 this.element 进行比较,this.element 是 TreeNode 中包含的对象。只需更改为:

return ((Comparable) this.element).compareTo(node.getElement());

假设你有 getElement 方法。

于 2011-11-21T01:52:48.980 回答