我正在尝试递归地运行我的方法。在方法的每次迭代中,我创建新的ArrayList
并填充一些值并检查if
运算符中的某些条件。如果是真的,将再次运行此方法。如果它是假的,我想退出当前迭代的方法,并在先前的ArrayList
副本的方法的前一次迭代中工作。在实践中,当我在条件中得到假并进入我的方法的前一次迭代时,我使用相同的ArrayList
。这很糟糕。
如何为方法的每次迭代创建ArrayList
的每个实例,并在后面的方法中使用ArrayList
的迭代实例进行操作?
我的代码:
private List<List<String>> letsTry(List<List<ProbableValue>>
probableValues, List<List<String>> data) {
List<List<String>> copyOfData = new ArrayList<List<String>>(data);
List<List<ProbableValue>> copyOfProbableValues =
new ArrayList<List<ProbableValue>>(probableValues);
ProbableValue minPV = getMinPV(copyOfProbableValues);
Set<String> pValues = new HashSet<String>(minPV.getProbableValues());
int i = minPV.getI();
int j = minPV.getJ();
for (String v : pValues) {
if (checker.canSetOnTable(copyOfProbableValues, minPV)) {
if (!SUtils.isItsNumber(copyOfData.get(i).get(j))) {
copyOfData.get(i).set(j, v);
copyOfProbableValues.get(i).get(j).getProbableValues().clear();
checker.removeProbableValue(copyOfProbableValues, v, i, j);
}
letsTry(new ArrayList<List<ProbableValue>>(copyOfProbableValues),
new ArrayList<List<String>>(copyOfData));
}
}
return copyOfData;
}
答案 0 :(得分:1)
您似乎正在创建包含列表的List的浅表副本。因此,只会复制嵌套列表的引用。如果你想要一个完整的深度拷贝,你必须做这样的事情:
List<List<String>> copyOfData = new ArrayList<List<String>>();
for (int i = 0; i < data.size(); i++) {
copyOfData.add(new ArrayList<String>());
for (String s : data.get(i)) {
copyOfData.get(i).add(s);
}
}
List<List<ProbableValue>> copyOfProbableData = new ArrayList<List<ProbableValue>>();
for (int i = 0; i < probableValues.size(); i++) {
copyOfProbableData.add(new ArrayList<ProbableValue>());
for (ProbableValue p : probableValues.get(i)) {
ProbableValue pNew = new ProbableValue();
// copy your object here
copyOfProbableData.get(i).add(pNew);
}
}