Java 返回一个迭代器

Java 返回一个迭代器,java,design-patterns,iterator,Java,Design Patterns,Iterator,在搜索有关迭代器的信息时,我只找到了一些示例,这些示例演示了如何迭代集合,而不是像我想做的那样返回迭代器 我正在为考试而练习,所以我正在尝试一些编程练习来为自己做准备,这一个是关于迭代器模式的。 我想实现getKnightPositionIterator。您可以看到下面的代码。这个代码不是我的,我找到了这个 package iterator; import java.util.*; public class Position { /** return an itera

在搜索有关迭代器的信息时,我只找到了一些示例,这些示例演示了如何迭代集合,而不是像我想做的那样返回迭代器

我正在为考试而练习,所以我正在尝试一些编程练习来为自己做准备,这一个是关于迭代器模式的。 我想实现
getKnightPositionIterator
。您可以看到下面的代码。这个代码不是我的,我找到了这个

package iterator;        
import java.util.*;

public class Position {

    /** return an iterator that will return all positions
     * that a knight may reach from a given starting position.
     */
    public static Iterator<Position> getKnightPositionIterator(Position p) {    


        return null;
    }


    /** create a position. 
     * @param r the row
     * @param c the column
     */
    public Position(int r, int c) { 
        this.r = r; this.c = c; 
    }

    protected int r;
    protected int c;

    /** get the row represented by this position.
     * @return the row.
     */
    public int getRow() { return r; }

    /** get the column represented by this position.
     * @return the column.
     */
    public int getColumn() { return c; }

    public boolean equals(Object o) {
        if (o.getClass() != Position.class) { return false; }
        Position other = (Position) o;
        return r==other.r && c==other.c;
    }

    public int hashCode() {
        // works ok for positions up to columns == 479
        return 479*r+c;
    }

    public String toString() {
        return "["+r+","+c+"]";
    }
}
包迭代器;
导入java.util.*;
公共阶级地位{
/**返回将返回所有位置的迭代器
*骑士可以从给定的起始位置到达。
*/
公共静态迭代器getKnightPositionIterator(位置p){
返回null;
}
/**创建一个职位。
*@param r该行
*@param c列
*/
公共位置(int r,int c){
这个.r=r;这个.c=c;
}
受保护的INTR;
受保护的INTC;
/**获取此位置表示的行。
*@返回该行。
*/
public int getRow(){return r;}
/**获取此位置表示的列。
*@返回该列。
*/
public int getColumn(){return c;}
公共布尔等于(对象o){
如果(o.getClass()!=Position.class){返回false;}
位置其他=(位置)o;
返回r==other.r&&c==other.c;
}
公共int hashCode(){
//对于列==479的位置,工作正常
返回479*r+c;
}
公共字符串toString(){
返回“[”+r+“,“+c+”]”;
}
}
然而,我认为我必须创建一个迭代器才能返回,所以,到目前为止,这是我的尝试

public static Iterator<Position> getKnightPositionIterator(Position p) {    
    Iterator<Position> knightPosIter = Position.getKnightPositionIterator(p);

    for(Iterator<Position> positions = knightPosIter; positions.hasNext(); ) {
        //What should I write here?
    }

    return knightPosIter;
}
公共静态迭代器getKnightPositionIterator(位置p){
迭代器knightPosIter=Position.getKnightPositionIterator(p);
for(迭代器positions=knightPosIter;positions.hasNext();){
//我应该在这里写什么?
}
返回骑士座;
}

首先,让您的类实现
Iterable
接口

public class Position implements Iterable<Position>
公共类位置实现Iterable
并编写
公共迭代器迭代器()方法,而不是在示例中提供静态方法

由于您实际上需要以某种方式计算可到达位置的集合,因此需要一个结构来容纳它。任何这样的结构通常都是可iterable的,因此将有一个迭代器方法。因此,惰性实现可能如下所示:

@Override
public Iterator<Position> iterator()
{
    // make sure this returns e.g. Collections.unmodifiableList
    Collection<Position> positions = computeReachablePositions(); 
    return positions.iterator();
 }
@覆盖
公共迭代器迭代器()
{
//确保返回例如Collections.unmodifiableList
收集位置=computeReachablePositions();
返回位置。迭代器();
}
如果您有一些其他结构来计算和存储不可编辑的位置(不可取),请按照如下所示从头实现迭代器(假定位置数组):

@覆盖
公共迭代器迭代器()
{
//必须是final才能从下面的迭代器访问
最终位置[]位置=计算机可调整位置();
返回新的迭代器(){
int指数=0;
@凌驾
公共布尔hasNext()
{
返回指数
Position currentPosition=positions.next()
?这不仅仅是看下一个位置吗?我不需要以某种方式保存所有位置,以便可以使用迭代器返回它们吗?迭代器是否保存它遇到的所有位置?用于删除/检查集合的元素,而不是“跟踪项目”。是的,我就是这么想的。那么,我如何将currentPosition(您建议的代码)与knightPosIter一起使用呢?到目前为止我写的代码是否正确?检查currentPosition是否可以合法地移动到电路板的边界内,因为position类具有row/col,它应该能够检查它所在的位置。
@Override
public Iterator<Position> iterator()
{
    // must be final to be accessible from the iterator below
    final Position[] positions = computeReachablePositions();

    return new Iterator<Position>() {

        int index = 0;

        @Override
        public boolean hasNext()
        {
            return index < positions.length;
        }

        @Override
        public Position next()
        {
            if (hasNext())
            {
                Position value = positions[index];
                index++;
                return value;
            }
            throw new NoSuchElementException("No more positions available");
        }

        @Override
        public void remove()
        {
            throw new UnsupportedOperationException("Removals are not supported");
        }};
}