3

私はこのプログラムに数日間取り組んでおり、BinarySearchTree クラスに挿入や削除などのいくつかの主要なメソッドを実装しました。挿入は正常に機能しているように見えましたが、削除しようとするとエラーが発生し続けました。そのため、コードをいじった後、compareTo メソッドをテストしたいと思いました。2 つの新しいノードを作成して比較しようとすると、次のエラーが発生します。

スレッド「メイン」の例外 java.lang.ClassCastException: TreeNode を java.lang.Integer にキャストできません java.lang.Integer.compareTo(Unknown Source) で 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メソッドをすべて間違っていますか? 整数と文字列を扱えるツリーを作りたい(もちろん別々に)

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 (ノード パラメータとして渡される) に対して適用され、TreeNode に含まれるオブジェクトである this.element と比較します。単純に次のように変更します。

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

getElement メソッドがあるとします。

于 2011-11-21T01:52:48.980 に答える