2011-05-04 45 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