Java 递归创建对象

Java 递归创建对象,java,recursion,arraylist,Java,Recursion,Arraylist,我正在尝试递归地运行我的方法。在方法的每次迭代中,我创建新的ArrayList,并在if操作符中填充一些值和检查一些条件。如果为真,将再次运行此方法。如果为false,我希望退出方法的当前迭代,并使用ArrayList的上一个副本在方法的上一个迭代中工作。实际上,当我在条件中得到false并在方法的上一次迭代中使用时,我使用相同的ArrayList。这很糟糕 如何为方法的每次迭代创建ArrayList的每个实例,以及在上一个方法中的后续操作何时使用该ArrayList迭代的实例 我的代码:

我正在尝试递归地运行我的方法。在方法的每次迭代中,我创建新的
ArrayList
,并在
if
操作符中填充一些值和检查一些条件。如果为真,将再次运行此方法。如果为false,我希望退出方法的当前迭代,并使用
ArrayList
的上一个副本在方法的上一个迭代中工作。实际上,当我在条件中得到false并在方法的上一次迭代中使用时,我使用相同的
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;

}
private List-letsTry(列表
可能值,列表数据){
List copyOfData=新阵列列表(数据);
列出可能值的副本=
新ArrayList(可能值);
ProbableValue minPV=getMinPV(CopyOfProbableValue);
Set pValues=新哈希集(minPV.getProbableValues());
int i=minPV.getI();
int j=minPV.getJ();
for(字符串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(可能值的副本,v,i,j);
}
letsTry(新ArrayList(copyOfProbableValues),
新ArrayList(copyOfData));
}
}
返回复制数据;
}

您似乎正在创建包含列表的列表的浅表副本。因此,将仅复制嵌套列表的引用。如果你想要一个完整的深度拷贝,你必须这样做:

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);
    }
}
List copyOfData=new ArrayList();
对于(int i=0;i