如何将我的一个函数转换为Iterable <t>函数?</t>

时间:2011-11-17 18:11:27

标签: java river-crossing-puzzle

我正在编写代码来实现不同的搜索功能来解决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() 
{
}

2 个答案:

答案 0 :(得分:1)

Iterable是一个界面:

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

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

我怀疑除了解决手头的问题之外,这项任务还试图让你做什么。

这个问题应该有所帮助:How can I implement the Iterable interface?

答案 1 :(得分:0)

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