【问题标题】:How to remove current element from List in java如何从java中的List中删除当前元素
【发布时间】:2017-12-28 22:23:58
【问题描述】:

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

【问题讨论】:

    标签: java arrays list loops data-structures


    【解决方案1】:

    问题是您正在编辑列表并同时阅读它。

    当你从列表中移除一个对象时,你必须减少计数器。

    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--); System.out.println("List: "+parts.get(i)); 进行打印时,它会引发异常 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
    • @Babarencho 尝试将您的打印声明移至 parts.remove(i--) 之前。如果您在该行之后有打印,那么对于第一次迭代 (i=0),i 在该行之后减 1,因此i=-1,这不是有效的数组索引。
    • @Vikram 感谢您的评论。我正在尝试在循环中访问列表中的列表我收到以下错误:线程“main”中的异常 java.lang.IndexOutOfBoundsException:索引:2,大小:1。你能帮我吗?
    • 是的,@Vikram 是对的。另一种方法是:System.out.println("List: " + parts.remove(i--); ArrayList 中的删除函数将返回删除的元素。
    • @Babarencho 我建议您自己单步调试代码(无论是精神上还是使用调试器)。您的错误是告诉您您正在尝试访问只有 1 个元素的数组的元素 2。
    【解决方案2】:

    另一种方法是:

     int loopNumber = 0;
        while (!parts.isEmpty()) {
            System.out.println("Loop" + loopNumber);
            parts.remove(0);
            loopNumber++;
            System.out.println(parts);
        }
    

    不知道你为什么要放置 Thread.sleep()。

    【讨论】:

    • 感谢您的回答。我试图在循环中访问 List 内的 List 我收到以下错误:Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 1。你能帮我做同样的事情吗?
    • 你在哪里调用parts.get(loopNumber)?
    • loopNumber++; System.out.println(parts.get(loopNumber)); loopNumber++之后
    • @Babarencho loopNumber 仅用于打印循环,您无法获得 2 因为您已经删除了它。这将导致异常。你能告诉我你想用parts.get(loopNumber)实现什么@
    【解决方案3】:

    您已经有了很好的答案,但我认为如果您想保留 for 语句,一种简单易读的方式不会在 ForUpdate 部分指定增量(i++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);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-20
      • 1970-01-01
      • 2013-03-23
      • 2019-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      相关资源
      最近更新 更多