二叉搜索树实现中迭代器和泛型的困难

时间:2009-12-14 08:13:15

标签: java generics iterator binary-tree

我正在研究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()+")");
    }
}

Pair与两个不同的泛型相关联,第一部分是Key,第二部分是与该键相关的Value。

我还需要在我的BST课程中实现Iterator。我正在一个看起来像这样的内部类中实现Iterator:

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>>令人窒息,但我不明白为什么。我假设这是我在某处使用泛型的错误,但我不完全确定在哪里看。

如果我提供的内容过于模糊,我很抱歉,但我在其他任何地方的实现中都没有遇到任何问题,但是在Iterator的实现中。

谁能告诉我这里做错了什么? 如果需要任何进一步的信息,请告诉我,我会尽力提供:)

1 个答案:

答案 0 :(得分:5)

问题在于您尝试使BSTMapIter通用的方式。它需要在两个类型参数KT中是通用的。 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);
}