2011-11-21 45 views
2

我已經在這個程序上工作了幾天,並且在BinarySearchTree類中實現了一些主要方法,比如插入和刪除。插入似乎工作正常,但一旦我嘗試刪除我不斷收到錯誤。所以在玩了代碼後,我想測試我的compareTo方法。我創建了兩個新節點,並嘗試對它們進行比較,並得到以下錯誤:在二進制搜索樹程序中使用compareTo

線程「main」中的異常java.lang.ClassCastException:TreeNode無法轉換爲java.lang.Integer at 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方法都錯了嗎?我想創建一個可以處理整數和字符串(seperatly當然)

+0

感謝所有幫助傢伙!我最終得到了它的工作,但問題是我誤解了一些變量,所以我最終迷惑了自己。我傳遞給compareTo方法的對象是元素本身,而不是TreeNode。在我的其他課上,我一直傳遞給它一個TreeNode,這就是爲什麼它搞砸了。再次感謝。 –

回答

2

嘗試樹木

public <T> int compareTo(Object node) 
{ 
    return ((Comparable) this.element).compareTo((TreeNode<T>) node).element); 
} 
2

compareTo方法應用於對樹節點(如節點參數傳遞),而你this.element進行比較,它是TreeNode中包含的對象。只需更改爲:

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

假設您有getElement方法。

2

可以肯定的是,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

爲了獲得最佳效果,請使用綁定的'>' – newacct

+0

@newacct剛編輯我的文章以包含您的建議,謝謝! –