如何从java中的List中删除当前元素

时间:2017-07-23 05:33:58

标签: java arrays list loops data-structures

如何在使用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)

3 个答案:

答案 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);
}