如何在使用for loop
进行迭代时从列表中删除当前元素?
我在下面的列表中包含:
List<String> list = new ArrayList<String>();
list.add("a");
list.add("a2");
list.add("a3");
list.add("a4");
list.add("a5");
list.add("a6");
list.add("a7");
list.add("a8");
list.add("a9");
list.add("a10");
list.add("a11");
list.add("a12");
list.add("a13");
list.add("a14");
list.add("a15");
List<List<String>> parts = chopped(list, 4);
System.out.println(parts);
这给我输出如下:
[[a, a2, a3, a4], [a5, a6, a7, a8], [a9, a10, a11, a12], [a13, a14, a15]]
现在我想从下面的程序列表中删除第一个列表:
for(int i=0; i<parts.size(); i++){
System.out.println("Loop number: "+i);
System.out.println("Current list: "+parts);
Thread.sleep(2000);
parts.remove(i);
System.out.println("After removing: "+parts);
}
这里我使用parts.remove(i);
删除当前元素,它给出了以下输出:
[[a, a2, a3, a4], [a5, a6, a7, a8], [a9, a10, a11, a12], [a13, a14, a15]]
Loop number: 0
Current list: [[a, a2, a3, a4], [a5, a6, a7, a8], [a9, a10, a11, a12], [a13, a14, a15]]
After removing: [[a5, a6, a7, a8], [a9, a10, a11, a12], [a13, a14, a15]]
Loop number: 1
Current list: [[a5, a6, a7, a8], [a9, a10, a11, a12], [a13, a14, a15]]
After removing: [[a5, a6, a7, a8], [a13, a14, a15]]
这个删除了第一个当前元素[a, a2, a3, a4]
,这是正确的,但在运行第二个循环时,它会删除[a9, a10, a11, a12]
。
我想像下面那样循环删除它:
[[a, a2, a3, a4], [a5, a6, a7, a8], [a9, a10, a11, a12], [a13, a14, a15]]
[[a5, a6, a7, a8], [a9, a10, a11, a12], [a13, a14, a15]]
[[a9, a10, a11, a12], [a13, a14, a15]]
[[a13, a14, a15]]
[]
编辑:
当我尝试使用parts.get(loopNumber)
或parts.get(i)来访问List内的List时,它会引发异常错误:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 1
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at gmailSendLaptopGUI.MyProgram.main(MyProgram.java:156)
答案 0 :(得分:3)
问题在于您正在编辑列表并同时阅读它。
从列表中删除对象时,必须减少计数器。
for(int i=0; i<parts.size(); i++){
System.out.println("Loop number: "+i);
System.out.println("Current list: "+parts);
Thread.sleep(2000);
parts.remove(i--);
System.out.println("After removing: "+parts);
}
答案 1 :(得分:1)
另一种方法是:
int loopNumber = 0;
while (!parts.isEmpty()) {
System.out.println("Loop" + loopNumber);
parts.remove(0);
loopNumber++;
System.out.println(parts);
}
不确定为什么要放置Thread.sleep()。
答案 2 :(得分:1)
您已经有了很好的答案,但我认为如果您想保留for
语句,一种简单易读的方式并未指定增量(i++
) ForUpdate
语句的for
部分,因为它不是强制性的,您始终要抑制当前的第一个元素(parts.remove(0)
)。
for(int i=0; i<parts.size(); ){
System.out.println("Current list: "+parts);
Thread.sleep(2000);
parts.remove(0);
System.out.println("After removing: "+parts);
}