Προβλήματα με τη σύγκριση των δύο γενικών αντικειμένων

ψήφοι
1

Το έργο μου είναι μια τηλεφωνικού καταλόγου που χρησιμοποιεί BSTree<E>. Κάθε κόμβος του δέντρου είναι BTNode<E>. Στην κύρια κατηγορία, θα αντικαταστήσει Ε με την κατηγορία ζευγάρι, το οποίο έχει (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>.

Τώρα, όταν τρέχω το πρόγραμμα και πρόκειται για το σύγκρισης, μου δίνει λάθη στο συγκριτικό επειδή τώρα συγκρίνει ανάμεσα σε δύο ζεύγη

Πώς μπορώ να επιλύσει αυτό το ζήτημα; Αυτό που θέλω είναι να συγκριθούν μεταξύ των ονομάτων των δύο ζευγαριών;

Συγγνώμη για την κακή εξήγηση μου. Αγγλικά μου είναι αδύναμη.

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

Επεξεργασία:

@Tim: Μετά από προσπάθεια λύση σας μου δίνει αυτό το σφάλμα:

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 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