0

我正在编写代码来实现不同的搜索功能来解决 Farmer Wolf Goat Cabbage 问题。我们获得了几个由我们的 main 和 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() 
{
}
4

2 回答 2

1

Iterable是一个接口:

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

您的FirstDepthSolver类需要实现该接口,因为这就是您从getPossibleMoves1(). 随后,这意味着您将不得不实现Iterator(或者将您需要迭代的任何内容存储在已经提供了一个交互器的 java Collection 中,然后返回它)。

我怀疑除了解决手头的问题之外,这就是作业试图让你做的事情。

这个 SO 问题应该会有所帮助:如何实现 Iterable 接口?

于 2011-11-17T18:24:13.197 回答
0

使 DepthFirstSolver 成为具有 Collection 类型成员变量的包装类。然后在 DepthFirstSolver 的构造函数上,将成员变量实例化为某种类型的集合(如您所愿....ArrayList)。在 DepthFirstSolver 类上创建 add 方法,调用 add 类的成员变量。在 DepthFirstSolver 中添加迭代器方法,调用成员变量的迭代器。这样你就不需要改变你的 FarmerWolfGoatCabbage 除了最后调用 DepthFirstSolver 的迭代器作为返回值。

于 2012-11-18T16:25:29.193 回答