-2

グリッドを保持する Program というクラスがあります。グリッドに入ることができるすべての可能な方法を保存し、ArrayList possi をすべての可能なエントリ ポイントと共に保存する 2 つのメソッド possi() と、提供されたエントリ ポイントでグリッドに実際に出入りするメソッド solve があります。私はdfsとbfsを使用してmazesolversを実行しましたが、私の問題は、ソルブが実際にグリッドを大幅に変更することです。通常、bfsとdfsは、変更された迷路を考慮していません。それが私がそれらを使用していない理由です。エントリーポイントとさらなるポイントのすべての可能性を乗り越えたいです。エントリ ポイントの最初のレベルは lev1.possi に格納されており、それらをループできます。次に、ソルブが構造を変更してソルブを適用し、その新しいオブジェクトから新しいポッシを返すため、グリッドの新しいインスタンスを作成する必要があります。基本的に、変更ごとに新しいオブジェクトを作成しています。

    Program lev1 = new Program();//initializes grid randomly
    lev1.possi();//calculates entry points and stores in possi

    ArrayList<Program> lev = new ArrayList<Program>();//stores all possible objects
    for (int i = 0; i < lev1.possi.size(); i++)//loops through all entry points
    {
        Program pick = new Program(lev1.grid.clone());//makes a new object
        lev.add(pick);
        lev.get(i).solve(lev1.possi.get(i));//changes the new object
        lev.get(i).possi();//calculates further points to go through
    }
4

2 に答える 2

1

grid配列などの複合型を含む複合型があると思います。この場合、clone()ディープコピーは作成されません(つまり、配列のように部分を再帰的に複製しません)。

複合型のメソッドの例clone()を次に示します。この例では、FlightLogEntryを含む型がありますTreeMap。クローンFlightLogEntryを作成するには、新しいTreeMap要素を作成し、元の要素を使用してマップを塗りつぶす必要があります。この例では、これらの要素は複製されません(clone.setAttendant(p, this.attendats.get(p))。クローンメソッドからさらに深いコピーが必要な場合(クローンの使用法によって異なります)、次のように出席者のクローンを作成することもできますclone.setAttendant(p, this.attendats.get(p).clone()

@Override
public FlightLogEntry clone() {
    FlightLogEntry clone = (FlightLogEntry) super.clone();
    clone.attendants = new TreeMap<Person, Duty>();
    for( Person p : this.attendants.keySet() ) {
        clone.setAttendant(p, this.attendants.get(p));
    }
    return clone;
}
于 2012-11-02T16:30:52.860 に答える
0

Program(grid) コンストラクターで新しいグリッド オブジェクトをインスタンス化し、古いグリッドの値を新しいグリッドに割り当てる必要があります。

于 2012-11-02T16:19:34.910 に答える