Проблемы, связанные с сравнением двух общих объектов

голоса
1

Мой проект является книгой , которая использует BSTree<E>. Каждый узел дерева BTNode<E>. В главном классе, я заменяю E с классом Pair, который имеет (String name, String number), когда я определяю узлы.

У меня есть следующий класс компаратор для сравнения между 2 типа E:

import java.util.Comparator;

public class BTNodeComparator<E> implements Comparator<E>
{
    public int compare(E a, E b) throws ClassCastException
    {
        return ((Comparable<E>) a).compareTo(b);
    }
}

и я использую его в BSTree<E>.

Теперь, когда я запускаю программу, и она приходит к компаратора, она дает мне ошибки на компаратор, потому что теперь он сравнивает между двумя парами

Как я могу решить эту проблему? То, что я хочу, чтобы сравнить между именами двух пар?

Извините за мое плохое объяснение. Мой английский слаб.

=========================

Редактировать:

@ Тим: После попытки своего решения он дает мне эту ошибку:

java.lang.NullPointerException
    at Pair.compareTo(Pair.java:36) // @ return name.compareTo(pair.getName());
    at Pair.compareTo(Pair.java:2)  // @ public class Pair implements Comparable<Pair>
    at BTNodeComparator.compare(BTNodeComparator.java:24) // @ return (a.compareTo(b));
    at BTNodeComparator.compare(BTNodeComparator.java:20) // @ public class BTNodeComparator<E extends Comparable<E>> implements Comparator<E>
    at BSTree.search(BSTree.java:285)
    at BSTree.insert(BSTree.java:300)
    at PhoneBook.main(PhoneBook.java:25)

Кстати, я decleared BTNodeComparator в BSTree следующим образом:

protected Comparator<E> c = new BTNodeComparator();
if (c.compare(target, cursor.getElement()) < 0) cursor = cursor.getLeft();
Задан 06/05/2011 в 02:16
источник пользователем
На других языках...                            


1 ответов

голоса
2

Единственный возможный отказ я мог видеть это ClassCastException. Чтобы исправить код , вам нужно будет указать свой Pairкласс , как это:

class Pair implements Comparable<Pair> {
    String name;
    String number;

    //some implementation stuff...

    @Override
    public int compareTo(Pair o) {
        return name.compareTo(o.name);
    }
}

В общем, если ваша Comparatorреализация зависит от общего типа , реализующего Comparableто вы должны указать это следующим образом :

public class BTNodeComparator<E extends Comparable<E>> implements Comparator<E> {
    public int compare(final E a, final E b) {
        return a.compareTo(b);
    }
}

Это просто дает вам компилировать безопасность времени без изменения семантики того , как Comparatorработает.

Основываясь на ваш комментарий, я предполагаю , что вы Встраивание BTNodeComparatorв BSTreeкласс в качестве гнездового внутреннего класса, что означает , что вы , вероятно , не может внести изменения без изменения определения типа в BSTreeдекларации.

Ответил 06/05/2011 в 02:27
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more