Как мне перевести одну из моих функций в функцию 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 в конце в качестве возвращаемого значения.