我已经在这个程序上工作了几天,我在BinarySearchTree类中实现了一些主要方法,比如insert和delete。插入似乎工作正常,但一旦我尝试删除我不断收到错误。所以在玩完代码之后我想测试我的compareTo方法。我创建了两个新节点,并试图比较它们,我得到了这个错误:
线程“main”中的异常java.lang.ClassCastException:TreeNode无法强制转换为java.lang.Integer 在java.lang.Integer.compareTo(未知来源) 在TreeNode.compareTo(TreeNode.java:16) 在BinarySearchTree.myComparision(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方法时错了吗?我想创建可以处理整数和字符串的树(当然是单独的)
答案 0 :(得分:3)
为了确保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
。
答案 1 :(得分:2)
尝试
public <T> int compareTo(Object node)
{
return ((Comparable) this.element).compareTo( ( TreeNode<T> ) node ).element);
}
答案 2 :(得分:2)
compareTo方法应用于TreeNode(作为节点参数传递),同时将其与this.element进行比较,this.element是TreeNode中包含的Object。只需更改为:
return ((Comparable) this.element).compareTo(node.getElement());
假设你有getElement方法。