2009-12-14 9 views
3

J'étudie des structures de données en Java et j'ai de la difficulté à utiliser des génériques dans les arbres de recherche binaire.Difficultés avec Iterator et les génériques dans l'implémentation de l'arborescence de recherche binaire

Pour notre affectation, nous devons implémenter un arbre de recherche binaire en utilisant des nœuds qui contiennent un nœud parent, gauche et droit ainsi qu'une valeur de données.

La valeur de données dans notre cas prend la forme d'un objet Pair. Voici ce qu'il ressemble à:

public class Pair<A,B> { 

    public final A fst; 
    public final B snd; 

    public Pair(A x, B y) { 
     fst = x; snd = y; 
    } 

    public String toString() { 
     return new String("("+fst.toString()+", "+snd.toString()+")"); 
    } 
} 

Paire est associtated avec deux génériques différents avec la première partie étant la clé et la seconde étant la valeur associée à cette clé. J'ai également besoin d'implémenter Iterator dans ma classe BST. Je suis mise en œuvre du Iterator dans une classe interne qui ressemble à ceci:

public Iterator<Pair<K,T>> iterator() { 
    return new BSTMapIter<Pair<K,T>>(this.root, this.size, this.order); 
} 

private class BSTMapIter<Pair<K,T>> implements Iterator<Pair<K,T>> { <=== Compiler error "> expected" 
    ... 
    ... (Implementation here) 
    ... 
} 

Le problème que je suis en cours d'exécution en est une erreur du compilateur dire « > expected » qui conduit à d'autres erreurs du compilateur (« <identifier expected> », etc.). D'après ma compréhension, il étouffe sur <Pair<K,T>> mais je ne sais pas pourquoi. Je suppose que c'est une erreur que j'ai faite en utilisant des génériques quelque part, mais je ne suis pas tout à fait sûr où regarder. Je m'excuse si ce que j'ai fourni est trop vague mais je n'ai rencontré aucun problème avec Pair dans mon implémentation ailleurs mais ici dans l'implémentation de l'Iterator.

Quelqu'un peut-il me dire ce que je fais mal ici ??? Si d'autres informations sont nécessaires, faites le moi savoir et je ferai de mon mieux pour fournir :)

Répondre

5

Le problème est la façon dont vous essayez de rendre BSTMapIter générique. Il doit être générique dans deux paramètres de type, K et T. La partie Pair n'est pas pertinente à ce stade. (Il est important quand il s'agit de quelle interface il implémente bien.) Donc, la déclaration doit être:

private class BSTMapIter<K,T> implements Iterator<Pair<K,T>> 

Cependant, c'est si vous voulez BSTMapIter être générique en soi. Si cela est une classe imbriquée dans un type qui déjà a K et T en tant que paramètres de type, vous probablement voulez:

private class BSTMapIter implements Iterator<Pair<K,T>> 

Vous voulez également instancier un peu différemment:

// When it's an inner class 
public Iterator<Pair<K,T>> iterator() { 
    return new BSTMapIter(this.root, this.size, this.order); 
} 

// When it's a standalone generic class 
public Iterator<Pair<K,T>> iterator() { 
    return new BSTMapIter<K, T>(this.root, this.size, this.order); 
}