0

Farmer Wolf Goat Cabbage の問題を解決するために、さまざまな検索機能を実装するコードに取り組んでいます。main クラスと FarmerWolfGoatCabbage クラスが実装するいくつかのクラスが与えられました。クラスの 1 つである 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 に iterator メソッドを追加して、メンバ変数の iterator を呼び出します。このように、戻り値として最後に DepthFirstSolver の反復子を呼び出す以外は、FarmerWolfGoatCabbage を変更する必要はありません。

于 2012-11-18T16:25:29.193 に答える