K [] preordine di Binary Search Albero () metodo: il ritorno generica

voti
0

Implementazione Uso: Dati Struttura Esercizio Lab per ottobre / 28/2011 Per fare: implementare un binario Ricerca albero

Problema: K [] ritorno dei metodi preorder (), inOrder () e postorder ()

Problema Dettagli: La BST deve avere solo la sua radice come parametro. I metodi sopra menzionati sono stati descritti in un'interfaccia proposta dal nostro professore come segue:

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

Ho potuto istanziare l'array generico con il seguente codice:

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

Ma, quando ho provato il metodo che utilizza una classe di prova fornita anche dal nostro professore, ho un NullPointerException, wich Credo si riferisce alla radice del BST, che è stato una volta istanziata, ma è stato rimosso in un punto nel test , e quando chiama di nuovo il metodo, il metodo restituisce null, non un array vuoto come previsto dal test:

    (...)

    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());

    (...)

Sapendo che non posso cambiare il tipo di ritorno, né i parametri del metodo, che cosa posso fare per evitare questa eccezione? Posso in qualche modo ottenere il tipo di componente e utilizzarlo per creare un'istanza della matrice vuota (Come ho fatto fare questo?)?

Eventuali suggerimenti per migliorare il mio codice sono i benvenuti.

È pubblicato 30/10/2011 alle 21:33
fonte dall'utente
In altre lingue...                            


1 risposte

voti
0

Domanda è: si ha realmente bisogno di un intero matrice restituita? - Io non la penso così.

Presumo assertArrayEquals()non non controllare il tipo di componente delle matrici, ma piuttosto confronta solo i valori contenuti.

Con il codice che avete mostrato, direi che tutto ciò non sarebbe stato possibile a causa del tipo di cancellazione.

Quindi, cercare di restituire un Object[]o qualsiasi altra cosa super-tipo si applica nel tuo caso:

return new Object[0];

e

return list.toArray();

(Calchi incontrollati necessari, ma che dovrebbe essere ok)

MODIFICARE:

Ok, quindi <K extends Comparable>?
In tal caso l'uso:

return new Comparable[0];

e

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

Risposto il 30/10/2011 a 22:00
fonte dall'utente

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