2012-06-25 144 views
0

所以我创建了一个混洗一组数字的方法,我的想法是我创建了这些数字的总体。 因此,我创建了一个循环,将数字进行混洗,然后将其添加到数组列表中,但是在发现一些调试语句后,我发现它会对数字进行混洗,但仅将最后一个混洗添加到arrayList。任何人都可以帮我弄清楚为什么?Java ArrayList填充

solutionList是一个ArrayList进一步向上的代码,如果有人想知道

for(int k =0;k <100; k++){ 
     Collections.shuffle(solutionList); 
     population2.add(new Object[]{solutionList}) ; 
     System.out.println("In the loop " + solutionList); 

    } 

    for(Object[] row : population2){ 
     System.out.println("Row = " + Arrays.toString(row)); 
    } 

回答

9

population2每个元素是与到相同ArrayList参考阵列。如果你想要不同的列表,你需要为每个迭代创建一个新列表。

例如,为了避免每次填充列表与正确的数字,你可以只洗牌solutionList,然后添加一个参照副本

for (int k = 0; k < 100; k++) { 
    Collections.shuffle(solutionList); 
    List<Integer> copy = new ArrayList<Integer>(solutionList); 
    population2.add(new Object[]{ copy }); 
} 
+0

啊辉煌,非常感谢你 – MurphyApps

3
population2.add(new Object[]{solutionList}) ; 

将创建一个对象数组一个单一的元素。该元素恰好是一个列表。

2

您正在创建100个阵列,每个阵列都包含对相同列表的引用。我想你想要的是创造100阵列,每个阵列包含列表元素的副本:

for(int k =0;k <100; k++){ 
    Collections.shuffle(solutionList); 
    population2.add(solutionList.toArray()) ; 
} 

但我会建议避免阵列完全,始终使用集合:

for(int k =0;k <100; k++){ 
    Collections.shuffle(solutionList); 
    population2.add(new ArrayList<Something>(solutionList)); 
}