2009-12-14 3 views
3

Я изучаю структуры данных в java, и у меня возникают трудности с использованием дженериков в деревьях двоичного поиска.Трудности с итератором и дженериками в реализации двоичного поиска

Для нашего назначения мы должны реализовать двоичное дерево поиска, используя узлы, которые содержат родительский, левый и правый узлы, а также значение данных.

Значение данных в нашем случае принимает форму объекта Pair. Это то, что он выглядит следующим образом:

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()+")"); 
    } 
} 

пар associtated с двумя различными воспроизведенными с первой частью является ключевым, а второй является значением, связанным с этим ключом.

Мне также нужно реализовать Iterator в моем классе BST. Я реализую Итератор во внутреннем классе, который выглядит примерно так:

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) 
    ... 
} 

Проблема Я бегу в это ошибка компилятора говоря «> expected», что приводит к другим ошибкам компилятора («<identifier expected>» и т.д.). По моему мнению, он задыхается от <Pair<K,T>>, но я понятия не имею, почему. Я предполагаю, что это ошибка, которую я сделал с использованием дженериков, но я не совсем уверен, где искать.

Прошу прощения, если то, что я предоставил, слишком расплывчато, но я не сталкивался с проблемами с Pair в моей реализации где-либо еще, но здесь, в реализации Iterator.

Может ли кто-нибудь сказать мне, что я делаю неправильно здесь ??? Если вам нужна дополнительная информация, дайте мне знать, и я сделаю все возможное, чтобы обеспечить :)

ответ

5

Проблема заключается в том, как вы пытаетесь создать BSTMapIter generic. Он должен быть общим для двух типов параметров: K и T. На данный момент часть Pair не имеет значения. (Это важно, когда дело доходит до того, что его интерфейс реализует, хотя.) Таким образом, декларация должна быть:

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

Однако, это если вы хотите BSTMapIter порождающим в себе. Если это вложенный класс внутри типа, который уже имеет K и T в качестве параметров типа, вы, вероятно, просто хочу:

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

Вы также хотите создать его экземпляр немного по-другому:

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