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

Java 将从arraylist放入数组,并在for循环中删除它,java,arrays,arraylist,Java,Arrays,Arraylist,所以我想从ArrayList中删除整数,我已经把它放入普通数组中了 我现在得到的是: int[] playersArray = null; ArrayList<Integer> spelers = new ArrayList<Integer>(); int[]playersArray=null; ArrayList spelers=新的ArrayList(); 你在这里看到的table.length是桌子的数量,table[j]。length是每个桌子可以得到的

所以我想从ArrayList中删除整数,我已经把它放入普通数组中了

我现在得到的是:

 int[] playersArray = null;

 ArrayList<Integer> spelers = new ArrayList<Integer>();
int[]playersArray=null;
ArrayList spelers=新的ArrayList();
你在这里看到的table.length是桌子的数量,table[j]。length是每个桌子可以得到的玩家数量。它工作得很好,但是它从PlayerList中删除了错误的整数,它删除了下一个整数,而不是放入playerArray的整数

 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]));
 }
for(int j=0;j
看看你的循环:

for(int i = 0; i < table[j].length; i++){
  playersArray[i] = playersList.get(i);
  playersList.remove(i);
}
for(int i=0;i
i==0
处,从
playersList
中删除项目0。这会将所有后续元素向下移动一个,将项目1移动到0,将项目2移动到1,依此类推。然后将
i
增加到1。现在您
get(i)
,它生成项目1,但这是新的项目1。旧项目1已移动到项目0!此时您正在检索旧项目2

这是一个示例,说明了为什么在迭代集合时不应在结构上更改集合。

来自以下文档:

删除此列表中指定位置的元素将任何后续元素向左移动(从其索引中减去一个)。

所以如果你的
playersList
是这样的

playersList[0] = 1
playersList[1] = 2
playersList[2] = 3
playersList[3] = 4
playersList之后。删除(0)
列表将被删除

playersList[0] = 2
playersList[1] = 3
playersList[2] = 4
因此,下一个操作(
playersList.remove(1)
)将不会在正确的元素上执行


如果您必须循环所有元素,您可以使用
playersList.remove(i)
替换为
playersList.remove(0)
,对于
playersList.get(i)

,正如其他人所解释的,您在移除每个元素时正在折叠列表,导致迭代跳过元素。以下是几种备选方案:

1) 继续拉出第一个元件:

for(int i = 0; i < table[j].length; i++){
    playersArray[i] = playersList.remove(0);
}
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();
for(int j=0;j

所有这些解决方案都假设
playersList
有足够的元素来填充
,就像您在示例中所做的那样。

您是否尝试阅读
ArrayList#remove
的功能以及列表内容的行为?只需使用中的一种方法,然后清除
playersList
,然后再显示
表的声明。
for(int j = 0; j < table.length; j++){
    ...
    for(int i = 0; i < table[j].length; i++){
        playersArray[i] = playersList.get(i);
    }
    ...
}
playersList.clear();