Problémy s porovnáním dvou obecné objekty

hlasů
1

Můj projekt je telefonní seznam, který používá BSTree<E>. Každý uzel stromu je BTNode<E>. V hlavní třídě, vyměním E s Pair třída, která má (String name, String number), když jsem definovat uzly.

Mám následující třídu komparátor pro porovnání mezi 2 typy 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);
    }
}

a používám ho BSTree<E>.

Teď, když jsem spustit program a jde o komparátor, to mi dává chyby v komparátor, protože teď se srovnává mezi dvěma páry

Jak mohu tento problém vyřešit? To, co chci, je porovnávat mezi jmény dvou párů?

Omlouvám se za mé špatné vysvětlení. Moje angličtina je slabý.

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

Upravit:

@Tim: Poté, co se snaží své řešení dává mi tuto chybu:

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, decleared I BTNodeComparator v BSTree takto:

protected Comparator<E> c = new BTNodeComparator();
if (c.compare(target, cursor.getElement()) < 0) cursor = cursor.getLeft();
Položena 06/05/2011 v 02:16
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
2

Jediným možným selháním Viděl jsem je ClassCastException. Chcete-li kód, budete muset zadat svoji Pairtřídu takto:

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

    //some implementation stuff...

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

Obecně platí, že pokud vaše Comparatorimplementace se opírá o výše uvedeného druhu, kterým se provádí Comparablepak byste měli určit takto:

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

Přitom právě vám umožní sestavit bezpečnostní čas beze změny sémantiku o tom, jak Comparatorfunguje.

Na váš komentář na bázi Hádám jste vkládání Vaše BTNodeComparatordo BSTreetřídy jako vnořené vnitřní třídy, který vás znamená, že pravděpodobně nemůže provést tuto změnu beze změny definice typu v BSTreeprohlášení.

Odpovězeno 06/05/2011 v 02:27
zdroj uživatelem

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