использование CompareTo в программе Binary Search Tree - PullRequest
2 голосов
/ 21 ноября 2011

Я работаю над этой программой уже несколько дней, и я реализовал несколько основных методов в моем классе BinarySearchTree, таких как вставка и удаление.Казалось, что вставка работает нормально, но как только я пытаюсь удалить, я продолжаю получать ошибки.Поэтому, поиграв с кодом, я захотел проверить свои методы 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?Я хотел бы создать деревья, которые могут обрабатывать целые числа и строки (по отдельности, конечно)

Ответы [ 3 ]

3 голосов
/ 21 ноября 2011

Чтобы быть уверенным, что 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 на консоли.

2 голосов
/ 21 ноября 2011

метод compareTo применяется к TreeNode (передается как параметр узла), а вы сравниваете его с this.element, который является объектом, содержащимся в TreeNode.Просто измените на:

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

, если у вас есть метод getElement.

2 голосов
/ 21 ноября 2011

Попробуйте

public <T> int compareTo(Object node) 
{ 
    return ((Comparable) this.element).compareTo( ( TreeNode<T> ) node ).element); 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...