Как мне перевести одну из моих функций в функцию Iterable<T>?

Я работаю над кодом для реализации различных функций поиска, чтобы решить проблему козлиной капусты. Нам дали несколько классов, которые реализовали наш основной класс и класс Farmer Wolf Goat Cabbage. Один из классов, AbstractSolver, включает строку

        Iterable<AState> moves = s.getPossibleMoves();
        for (AState move : moves)
            if (!closed.contains(move))
                addState(move);

Вот мой класс Farmer Wolf Goat Cabbage. Я в основном хочу перевести следующую функцию

public DepthFirstSolver getPossibleMoves1(){

    DepthFirstSolver moves = null;

    //use getOpposite() and addIfSafe
    FarmerWolfGoatState fwgsParent = new FarmerWolfGoatState();
    FarmerWolfGoatState fwgsChild = null;
    int hash;
    // the farmer's current position before crossing the river
    Side farmerCurrent = this.farmer;

    if(this.wolf == farmerCurrent){
        fwgsChild = new FarmerWolfGoatState(this, this.getOpposite(this.farmer),
                    this.getOpposite(this.wolf), this.goat, this.cabbage);
        hash = fwgsChild.hashCode();
        if(addIfSafe(hash))
            moves.addState(fwgsChild);  
        System.out.println("W");
    }

    if(this.cabbage == farmerCurrent){
        fwgsChild = new FarmerWolfGoatState(this, this.getOpposite(this.farmer),
                    this.wolf, this.goat, this.getOpposite(this.cabbage));
        hash = fwgsChild.hashCode();
        if(addIfSafe(hash))
            moves.addState(fwgsChild);  
        System.out.println("C");
    }   

    if(this.goat == farmerCurrent){
        fwgsChild = new FarmerWolfGoatState(this, this.getOpposite(this.farmer),
                    this.wolf, this.getOpposite(this.goat), this.cabbage);
        hash = fwgsChild.hashCode();
        fwgsChild.getPosition();
        //

        if (fwgsChild == null)
            System.out.println("NULL");

        if(addIfSafe(hash))
            //moves.addState(fwgsChild);
        System.out.println("G");
    }

    return moves;
}

в похожую функцию, но с возвращаемым типом Iterable

public Iterable<AState> getPossibleMoves() 
{
}

2 ответа

Iterable это интерфейс:

http://download.oracle.com/javase/6/docs/api/java/lang/Iterable.html

Ваш FirstDepthSolver класс должен реализовать этот интерфейс, так как это то, что вы возвращаетесь из getPossibleMoves1(), Впоследствии это означает, что вам придется реализовать Iterator (или храните все, что вам нужно для перебора, в java Collection, которая уже предоставляет интегратор, и возвращайте это).

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

Этот вопрос SO должен помочь: как я могу реализовать интерфейс Iterable?

Сделайте DepthFirstSolver классом-оболочкой с переменной-членом типа Collection. Затем в конструкторе DepthFirstSolver создайте экземпляр переменной-члена для некоторого типа коллекции (как вы хотите....ArrayList). Создайте метод add в классе DepthFirstSolver, чтобы вызвать переменные-члены класса add. Добавьте метод итератора в DepthFirstSolver для вызова итератора переменной-члена. Таким образом, вам не нужно менять свой FarmerWolfGoatCabbage, кроме вызова итератора DepthFirstSolver в конце в качестве возвращаемого значения.

Другие вопросы по тегам