2013-03-09 99 views
0

我试图递归运行我的方法。在每次迭代的方法中,我创建新的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; 

} 

回答

1

看来你创建一个包含列表的列表的浅表副本。因此只会复制嵌套列表的引用。如果你想要一个完整的深度副本,你必须做这样的事情:

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); 
    } 
} 
+0

你是对的。是工作。谢谢。 – San4o 2013-03-10 08:05:52