从arraylist放入数组并在for循环中删除它

时间:2016-06-15 22:58:18

标签: java arrays arraylist

所以我想从已经放入普通数组的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]));
 }

3 个答案:

答案 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,就像您在示例中所做的那样。