我有一个名为Program的类,它持有一个网格。它有两个方法possi(),它可以保存所有可能进入网格的方法,并使用所有可能的入口点和方法解决方法保存ArrayList possi,实际进入并使用提供的入口点进入网格。我已经使用dfs和bfs完成了mazesolvers但是我的问题是解决实际上通常会更改网格通常bfs和dfs不会占用更改的迷宫。这就是我不使用它们的原因。我想通过切入点和更多点的所有可能性。我的第一级入口点存储在lev1.possi中,我可以遍历它们。然后我必须创建一个新的网格实例,因为solve将改变结构并应用求解然后从该新对象返回新的possi。所以基本上我是为每个变化创建一个新对象。问题是grid.clone()没有创建一个新对象,而是仍然引用我的旧网格。
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
}
答案 0 :(得分: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;
}
答案 1 :(得分:0)
您需要在Program(网格)构造函数中实例化一个新的网格对象,然后使用新网格分配旧网格中的值。