Как мне перевести одну из моих функций в функцию Iterable <T>? - PullRequest
0 голосов
/ 17 ноября 2011

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

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

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

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 ]

1 голос
/ 17 ноября 2011

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

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

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

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

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

0 голосов
/ 18 ноября 2012

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

...