2013-03-09 80 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