-2

我有一个名为 Program 的类,它包含一个网格。它有两个方法 possi() 保存所有可能的进入网格的方法,并保存 ArrayList possi 和所有可能的入口点和方法solve ,它实际进入并使用提供的入口点进入网格。我已经使用 dfs 和 bfs 完成了 mazesolvers,但我的问题是,solve 实际上基本上改变了网格,通常 bfs 和 dfs 不考虑被改变的迷宫。这就是我不使用它们的原因。我想通过切入点和进一步点的所有可能性。我的第一级入口点存储在 lev1.possi 中,我可以循环访问它们。然后我必须创建一个网格的新实例,因为solve会改变结构并应用solve然后从那个新对象返回新的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 方法中获得更深的副本(这取决于克隆的使用),您可能还想像这样克隆 attenat 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 回答