2011-05-04 68 views
0

我堅持以下概率。忽略大多數代碼,我的問題是:每次迭代都有不同的列表x,我想在2DarrayList conVert中解析它,所以我使用conVert.add(x);但我的問題是在x.clear();.當我打印conVert之前,明確CONVERT是好的,但當我打印後清除除了X也conVert清除。我能爲此做些什麼?在此先感謝向2D陣列列表添加一個列表

  List<Integer> x = new ArrayList<Integer>(); 
     // List<Integer> x1 = new ArrayList<Integer>(); 
     List<Integer> valenceList = new ArrayList<Integer>(); 
     List<List<Integer>> conVert = new ArrayList<List<Integer>>(); 


     for (int q = 1; q <= 4; q++) { 


      for (int i = 0; i < Faces.length; i++) { 

       for (int j = 0; j < 2; j++) { 

        if (Faces[i][j] == q) { 

         x.add(Faces[i][0]); 
         x.add(Faces[i][1]); 
         x.add(Faces[i][2]); 

        } 
       } 
      } 
      removeDuplicateWithOrder((ArrayList) x); 
      valenceList.add(x.size() -1); 
      //x1 = x; 
      conVert.add(x); 
      System.out.println(conVert); 
      x.clear(); 
       //System.out.println(conVert); 
     } 

回答

1

你加入xconVert是要遵循x任何改變,因爲它只是把列表中的一個參考。你可以像這樣,而不是複製:

conVert.add(new ArrayList<Integer>(x)); 

或者你可以只移動的x建設中的第一個for循環,跳過清晰。

+0

對。你可以用'conVert.add(x.clone());'保存幾個字符,儘管這意味着將'x'類型保存爲'ArrayList'。 – 2011-05-04 09:14:32

+0

@Daniel:你也需要將其轉換,即'conVert.add(((ArrayList)x.clone());'。我認爲將'x'的構造移動到第一個循環並移除清除會節省大多數字符:) – WhiteFang34 2011-05-04 09:20:21

+0

廢話,您可以只執行'l.getClass()。getMethod(「clone」)。invoke l);':-) – 2011-05-04 09:23:36

0

如果我正確理解你,你會發現conVert的內容和x都被清除了。這是因爲list.add不是深層副本,它只是將引用放到原始文件中。你可以做的是克隆x並添加 -

List<Integer> tempX = new List<Integer>(); 
tempX.addAll(x); 
conVert.add(tempX); 
x.clear(); 

這應該工作。

+0

謝謝你們,這正是我想要的。 – zenitis 2011-05-04 15:59:28