2013-10-25 30 views
1

我创建了一个由80名Arraylist组成的ArrayList。每个ArrayList里面都有值1-9。ArrayList的Arraylist删除函数影响所有Arraylists

但是,当我从其中一个Arraylists中删除一个值时,其中的所有值都被删除。

ArrayList<List> available = new ArrayList<List>(); 
ArrayList<Integer> possibleValues = new ArrayList<Integer>(); 



    for(int j = 1; j<=9; j++){ 
     possibleValues.add(j); 
    } 

    for (int i = 0; i<=80; i++){ 
     available.add(possibleValues); 
    } 

    int b = (int) available.get(0).get(2); 
    available.get(0).remove(0); 
    String s = available.get(80).toString(); 
    System.out.println(" " + s); 

} 

任何帮助表示赞赏。

回答

6

这里的问题在于,您添加了相同的ArrayListpossibleValuesavailable 81次。因此,available列表包含对同一个possibleValues列表的81个引用。

对列表所做的任何更改都可以通过这81个引用中的任何一个来看到。

如果您不希望更改所有引用可见的,只有一个,那么你需要做的清单81份补充:

for (int i = 0; i<=80; i++){ 
    available.add(new ArrayList<Integer>(possibleValues)); 
} 
1

这是因为您将相同的ArrayList添加到外部ArrayList的每个索引。对此ArrayList的任何更改将自动导致其他ArrayList的更改。

嵌套您的循环始终创建一个新的ArrayList或构建一个新的ArrayList从现有的。

1

因为你要添加的值相同的ArrayList。您需要为0到80次迭代创建新的Arraylist。

for(int j = 1; j<=9; j++){ 
     possibleValues.add(j);// one ArrayList with values. 
} 


for (int i = 0; i<=80; i++){ 
     available.add(possibleValues); //Here adding same Arraylist 80 times. 
} 

试试这个

ArrayList<List> available = new ArrayList<List>(); 
    ArrayList<Integer> possibleValues = new ArrayList<Integer>(); 

    for (int i = 0; i<=80; i++){ 
    possibleValues = new ArrayList<Integer>(); 
    for(int j = 1; j<=9; j++){   
     possibleValues.add(j); 
    } 
    available.add(possibleValues); 
    } 
+1

请解释为什么此代码正在工作,而不是简单地提供,+1虽然:) –

0

您添加相同ArrayList的81倍。 ArrayList是一个引用类型,所以对它的任何更改都会影响所有项目。它应该是:

available.add(new ArrayList(possibleValues));