Problemy z porównywania dwóch obiektów generycznych

głosy
1

Mój projekt jest książka telefoniczna, która korzysta BSTree<E>. Każdy węzeł drzewa jest BTNode<E>. W głównej klasy, mogę wymienić E z klasą Para, która ma (String name, String number), kiedy definiują węzły.

Mam następujące klasy komparatora do porównania pomiędzy 2 rodzaje 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);
    }
}

i używam go BSTree<E>.

Teraz, gdy uruchamiam program i chodzi do komparatora, to daje mi błędy w komparatora bo teraz porównuje się między dwoma parami

Jak mogę rozwiązać ten problem? Co chcę jest porównanie między nazwiskami dwóch par?

Przepraszam za mój zły wyjaśnień. Mój angielski jest słaby.

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

Edytować:

@Tim: Po wypróbowaniu swoje rozwiązanie to daje mi ten błąd:

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)

BTW, ja decleared BTNodeComparator w BSTree następująco:

protected Comparator<E> c = new BTNodeComparator();
if (c.compare(target, cursor.getElement()) < 0) cursor = cursor.getLeft();
Utwórz 06/05/2011 o 02:16
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
2

Jedyna możliwa awaria może widzę to ClassCastException. Aby rozwiązać swój kod trzeba będzie określić Pairklasę tak:

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

    //some implementation stuff...

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

W ogóle, jeśli Comparatorrealizacja zależy od typu rodzajowego wykonawczego Comparablenastępnie należy określić ją tak:

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

W przeciwnym razie po prostu daje Ci bezpieczeństwo w czasie kompilacji bez zmiany semantyki, w jaki sposób Comparatordzieła.

Na podstawie Twojego komentarza, zgaduję jesteś Umieszczanie BTNodeComparatorw BSTreeklasie jako zagnieżdżonego wewnętrznej klasy, co oznacza, że prawdopodobnie nie może dokonać takiej zmiany bez zmiany definicji typu w BSTreedeklaracji.

Odpowiedział 06/05/2011 o 02:27
źródło użytkownik

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