Κ [] παραγγελίας Δυαδική Αναζήτηση Δέντρο της () μέθοδος: για το γενικό επιστροφή

ψήφοι
0

Εφαρμογή Χρήση: Δομές Δεδομένων Εργαστήριο Άσκηση για τον Οκτώβριο / 28/2011 Για να κάνετε: Να εφαρμοστεί μια δυαδική αναζήτηση Δέντρο

Πρόβλημα: K [] επιστροφή των μεθόδων preorder (), Inorder () και postOrder ()

Πρόβλημα Λεπτομέρειες: Η BST πρέπει να έχει μόνο τη ρίζα του ως παράμετρο. Οι μέθοδοι που αναφέρθηκαν παραπάνω έχουν περιγραφεί σε μια διασύνδεση δίνεται από τον καθηγητή μας ως εξής:

    /**
    * Returns an array of keys filled according
    * to the pre-order traversing in a BST.  
    */      
    public K[] preOrder();      
    public K[] order();         
    public K[] postOrder();

Θα μπορούσα υπόσταση το γενικό πίνακα με τον ακόλουθο κώδικα:

public K[] preOrder() {

    if (root == null) { return null; }

    ArrayList<K> list = new ArrayList<K>();
    preOrderRecursive(root,list);
    K[] toReturn = (K[]) Array.newInstance(this.getRoot().getKey().getClass(), list.size());

    for (int i = 0; i < list.size(); i++) {
        toReturn[i] = list.get(i);
    }

    return toReturn;
}

Αλλά, όταν δοκίμασα τη μέθοδο που χρησιμοποιεί μια κατηγορία δοκιμών που προβλέπονται και από τον καθηγητή μας, πήρα ένα NullPointerException, διασκορπισμένες νομίζω ότι αναφέρεται στη ρίζα του BST, που έχει για άλλη μια αρχικοποιείται, αλλά έχει αφαιρεθεί σε ένα σημείο στη δοκιμή , και όταν καλεί τη μέθοδο και πάλι, η μέθοδος επιστρέφει null, δεν έναν άδειο πίνακα όπως αναμένεται από τη δοκιμή:

    (...)

    tree1 = new BSTImpl<Integer, Integer>();
    for (int i = 0; i < SIZE; i++) {
        tree1.insert(i, i);
    }
    tree1.remove(1);
    tree1.remove(2);
    tree1.remove(3);
    tree1.remove(4);
    assertArrayEquals(new Integer[]{},tree1.preOrder());

    (...)

Γνωρίζοντας ότι δεν μπορώ να αλλάξετε τον τύπο επιστροφής ούτε τις παραμέτρους της μεθόδου, τι μπορώ να κάνω για να αποφευχθεί αυτή η εξαίρεση; Μπορώ με κάποιο τρόπο να πάρει την επικύρωση και να το χρησιμοποιήσετε για να υπόσταση το κενό πίνακα (Πως το κάνω αυτό;);

Κάθε συμβουλές για τη βελτίωση κωδικό μου είναι επίσης ευπρόσδεκτες.

Δημοσιεύθηκε 30/10/2011 στις 21:33
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
0

Ερώτηση είναι: Πιστεύετε πραγματικά χρειάζεστε ένα Ακέραιος σειρά επέστρεψε; - Δεν νομίζω ότι έτσι.

Υποθέτω ότι assertArrayEquals()δεν δεν ελέγχει την επικύρωση των πινάκων, αλλά μάλλον συγκρίνει μόνο τις τιμές που περιέχονται.

Με τον κωδικό σας έδειξα, θα ήθελα να πω τίποτα άλλο δεν θα ήταν δυνατή λόγω του τύπου της διαγραφής.

Έτσι προσπαθούν να επιστρέψουν ένα Object[]ή οτιδήποτε άλλο super-τύπου ισχύει στην περίπτωσή σας:

return new Object[0];

και

return list.toArray();

(Απαιτείται ανεξέλεγκτη εκμαγεία, αλλά αυτό θα πρέπει να είναι ok)

ΕΠΕΞΕΡΓΑΣΙΑ:

Εντάξει, έτσι <K extends Comparable>;
Σε αυτή την περίπτωση χρήσης:

return new Comparable[0];

και

return (Comparable[])list.toArray(new Comparable[]);

Απαντήθηκε 30/10/2011 στις 22:00
πηγή χρήστη

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