2014-01-06 6 views
3

Поиск информации об итераторе, я нашел только примеры, показывающие, как перебирать коллекцию и не возвращать Итератор, как я хочу.Возврат итератора

Я практикуюсь на экзамене, поэтому я пробую некоторые упражнения по программированию, чтобы подготовиться, и это касается шаблона итератора. Я хочу реализовать 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+"]"; 
    } 
} 

Как всегда, я полагаю, что я должен создать итератор, чтобы вернуться, так, до сих пор, это мой attemp.

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; 
} 
+1

'Position currentPosition = position.next()'? –

+0

Будет ли это смотреть не только на следующую позицию? Разве мне не нужно сохранять все позиции таким образом, чтобы их можно было вернуть с помощью Итератора? Сохраняет ли итератор все позиции, с которыми он сталкивается? – user1960836

+1

[Итераторы] (http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html#Iterator) используются для удаления/проверки элементов коллекции, а не «отслеживания элементов». –

ответ

6

Во-первых, сделать свой класс реализации Iterable интерфейс

public class Position implements Iterable<Position> 

и написать метод public Iterator<Positions> iterator();, как описано ниже, вместо того, чтобы обеспечить статический метод в вашем примере.

Поскольку вам действительно необходимо вычислить коллекцию достижимых позиций так или иначе, вам понадобится структура для ее удержания. Любая такая структура обычно будет итерабельной и, таким образом, будет иметь метод итератора. Так ленивая реализация может выглядеть следующим образом:

@Override 
public Iterator<Position> iterator() 
{ 
    // make sure this returns e.g. Collections.unmodifiableList 
    Collection<Position> positions = computeReachablePositions(); 
    return positions.iterator(); 
} 

В случае, если у вас есть другие структуры, чтобы вычислить и сохранить свои позиции, не итератор (не рекомендуется), реализовать итератор с нуля следующим образом (массив позиций предполагается):

Смежные вопросы