所以我想从已经放入普通数组的ArrayList中删除Integer。
我现在拥有的是:
int[] playersArray = null;
ArrayList<Integer> spelers = new ArrayList<Integer>();
table.length你在这里看到的是表的数量,表[j] .length是每个表可以获得的玩家数量。它运行良好,但它从PlayerList中删除了错误的Integer,它删除了下一个,而不是放入playersArray的那个。
for(int j = 0; j < table.length; j++){
playersArray = new int[table[j].length];
for(int i = 0; i < table[j].length; i++){
playersArray[i] = playersList.get(i);
playersList.remove(i);
}
table[j] = playersArray;
System.out.println("tafel: " + (j+1) + " " + Arrays.toString(tafel[j]));
}
答案 0 :(得分:1)
看看你的循环:
for(int i = 0; i < table[j].length; i++){
playersArray[i] = playersList.get(i);
playersList.remove(i);
}
在i == 0
,您可以从playersList
中删除第0项。这会将所有后续元素向下移动一个,第1项为0,第2项为1,依此类推。然后将i
增加到1.现在,get(i)
产生第1项,但这是新项1. 旧项目1被移到第0项!您此时正在检索旧项目。
这是为什么在迭代它时不应该在结构上改变集合的一个例子。
答案 1 :(得分:1)
来自ArrayList.remove的文档:
删除此列表中指定位置的元素。 向左移动任何后续元素(从索引中减去一个)。
因此,如果您的playersList
是这样的
playersList[0] = 1
playersList[1] = 2
playersList[2] = 3
playersList[3] = 4
在playersList.remove(0)
列表之后
playersList[0] = 2
playersList[1] = 3
playersList[2] = 4
因此,下一个操作(playersList.remove(1)
)将不会在正确的元素上执行。
如果您只是要遍历所有元素,则只需将playersList.remove(i)
替换为playersList.remove(0)
,playersList.get(i)
也是如此。
答案 2 :(得分:0)
正如其他人所解释的那样,当您删除每个元素时,您正在折叠列表,从而导致迭代跳过元素。以下是几种选择:
1)继续拉出第一个元素:
for(int i = 0; i < table[j].length; i++){
playersArray[i] = playersList.remove(0);
}
2)使用Iterator.remove()
迭代时删除:
Iterator<Integer> playersIter = playersList.iterator();
for(int j = 0; j < table.length; j++){
...
for(int i = 0; i < table[j].length; i++){
playersArray[i] = playersIter.next();
playersIter.remove();
}
...
}
3)如果您不期望或不需要剩余元素,您可以通过索引获取每个元素并在完成后清除列表:
for(int j = 0; j < table.length; j++){
...
for(int i = 0; i < table[j].length; i++){
playersArray[i] = playersList.get(i);
}
...
}
playersList.clear();
所有这些解决方案都假定playersList
有足够的元素来填充table
,就像您在示例中所做的那样。