java - 用 Java 编写通用迭代器

标签 java generics iterator abstract-class ienumerable

当我存储我的类的集合时,出现内存不足的异常 AbstractState在内存中,所以我试图编写一个可迭代/迭代器。我有一点 C# 知识,但很少有 Java 经验。在 C# 中,我会编写一个返回 IEnumerable<AbstractState> 的方法。 ,但这里似乎并不那么容易。

AbstractState存储一对坐标,尽管根据实现的不同,对它们的操作有所不同。 (它还扩展了通用 MyPair<Coordinate> 。)

AbstractState内,我定义了一个构造函数AbstractState(Coordinate A, Coordinate B){super(A,B);} 。我在一些但不是所有子类中重写了它。 Coordinate是具体的。这是我的迭代:

import java.util.Iterator;

public class StateSpace<T extends AbstractState> implements Iterable<T> {
    @Override
    public Iterator<T> iterator() {
        return new StateIterator();
    }
}

和我的迭代器:

public class StateIterator<T extends AbstractState> implements Iterator<T> {
    private Iterator<Coordinate> iX, iY;

    StateIterator(){
        iX = Main.GRID.iterator();
        iY = Main.GRID.iterator();
    }

    @Override
    public boolean hasNext() {
        return iX.hasNext() || iY.hasNext();
    }

    @Override
    public T next() {
        return null;
    }
}

( GRID 这里是 Coordinate 秒的静态范围。)

如何实现 next()方法正确吗? (或者,我的代码有什么更好的设计来解决这个问题?)

<小时/>

实例化 T不起作用,我无法实例化抽象类。我想我已经接近尝试了

getDeclaredConstructor(Coordinate.class, Coordinate.class).newInstance(iX.next(), iY.next());

但是我收到了编译器警告,提示没有这样的方法。

当我转换到 T 时,我进行了未经检查的转换,因此怀疑这是一个坏主意。拥有许多迭代器/可迭代对象是没有吸引力的,因为我会检查(通过 if 语句或 switch )我需要哪个迭代器,这会破坏我的 OO 代码设计。

任何建议表示赞赏,谢谢

最佳答案

this 传递给迭代器构造函数。 StateSpace 可以访问实例化的 T 类型,因此它可以实现方法来确定如何 getNext()hasNext()。目前尚不清楚 iXiY 的含义。

import java.util.Iterator;

public class StateSpace<T extends AbstractState> implements Iterable<T> {
    List<T> types;
    int pos;

    public StateSpace() {
        types = new ArrayList<>();
    }
    public void add(T type) {
        types.add(type);
    }
    T getNext() {
        return types.get(pos++);
    }
    boolean hasNext() {
         return pos < types.size()-1;
    }
    @Override
    public Iterator<T> iterator() {
        return new StateIterator(this);
    }
}

public class StateIterator<T extends AbstractState> implements Iterator<T> {
    private Iterator<Coordinate> iX, iY;
    private StateSpace<T> stateSpace;

    StateIterator(StateSpace<T> stateSpace){
        this.stateSpace = stateSpace;
        iX = Main.GRID.iterator();
        iY = Main.GRID.iterator();
    }

    @Override
    public boolean hasNext() {
        return iX.hasNext() || iY.hasNext();
    }

    @Override
    public T next() {
        return stateSpace.getNext(); // or whatever.
    }
}

也许有帮助。

关于java - 用 Java 编写通用迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49713031/

相关文章:

java - 使用 Java 将文本复制到剪贴板

java - Hibernate 中泛型类的映射

c++ - 如何为按需构造其值的迭代器实现 operator->?

java - 从 -main 调用时,Clojure 函数不将输出写入文件

java - Joda-Time 比较 NoSuchMethod

java - Android Studio > GridLayout > 如何获取单元格的位置?

java - Number 子类的防御性复制

c# - 如何在 C# 中实现通用缓存管理器

c# - yield 递延迭代问题

c++ - 使用 STL 的迭代器上的 UTF-8 到 UTF-32