【问题标题】:Why ArrayList giving unordered output?为什么 ArrayList 给出无序输出?
【发布时间】:2013-08-28 12:11:12
【问题描述】:

我编写了 java 程序,在 ArrayList 中添加整数并从 ArrayList 中删除该整数。但它没有给我正确的结果。这是我的代码..

public static void main(String args[])
  {
    ArrayList<Integer> a=new ArrayList<Integer>();

    a.add(6);
    a.add(7);
    a.add(8);
    a.add(9);

    for(int i=0;i<=a.size();i++)
    {

        System.out.println("Removed Elements=>"+a.remove(i));
    }
  }

它给我的输出如下

    Removed Elements=>6
Removed Elements=>8
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
    at java.util.ArrayList.RangeCheck(ArrayList.java:547)
    at java.util.ArrayList.remove(ArrayList.java:387)
    at CollectionTemp.main(CollectionTemp.java:19)

为什么我会得到这样的输出?

【问题讨论】:

  • 为什么你的循环是基于 1 的,而不是基于 0 的?
  • 对我来说看起来是正确的输出。你期待的是什么?
  • stackoverflow.com/questions/15827703/… 关于如何解决这个问题的好帖子
  • 使用调试器单步执行该代码可能是一个好主意,即使下面的答案解释了它。在每一步之后查看a的内容。
  • 请不要在遍历集合时更改集合。这是个坏主意。

标签: java loops


【解决方案1】:

你的数组:

a[0]=6
a[1]=7 <-- i
a[2]=8
a[3]=9

然后在 1 处移除,i 递增到 2:

a[0]=6
a[1]=8
a[2]=9 <-- i

记住数组索引从 0 开始,所以最后一个元素是 a.length - 1

你得到你的异常是因为循环条件i &lt;= a.size(),所以在最后一次迭代中:

a[0] = 7
a[1] = 9
  2  <-- i

【讨论】:

    【解决方案2】:

    当您从列表或任何集合中删除项目时,您要么使用迭代器,要么使用像这样的反向循环。

    for (int i = (a.size() - 1); i >= 0; i--) {
        System.out.println("Removed Elements=>" + a.remove(i));
    }
    

    通过倒退,您可以避免其他答案中记录的 2 递增问题。

    【讨论】:

      【解决方案3】:

      对于第一次迭代,a.remove(i) 导致元素 7 被删除,该元素由 remove 方法返回。

      对于第二次迭代,列表的大小为 3,您要删除索引 2 处的元素,即 9。所以 remove 方法返回 9。

      总之

      Iteration | Size of list | index being removed | element removed
      ----------+--------------+---------------------+----------------
          1     |      4       |          1          |       7   
          2     |      3       |          2          |       9  
      

      【讨论】:

      • 同样i&lt;=a.size()应该是i&lt;a.size()
      • 另外,如果你想删除第一个元素,你应该将 i 设置为 0,因为 ArrayLists 是从零开始的
      • @MarounMaroun,哇.. 谢谢 :) 有什么我可以快速完成的吗?
      【解决方案4】:

      如果您想要一个前向循环来删除所有元素,您可以使用以下代码:

      while(!a.isEmpty())
      {
          System.out.println("Removed Elements=>" + a.remove(0));
      }
      

      【讨论】:

        【解决方案5】:

        您的问题是,当您删除元素时,您会调整 ArrayList 的大小。但是,您的循环计数器没有更新,因此您遍历了 ArrayList 的边界。

        ArrayList.remove(index) 会从数组中移除元素,而不仅仅是 ArrayList 的内容,它实际上会在您移除项目时调整 ArrayList 的大小。

        首先删除 ArrayList 的第一个元素。

        Removed Elements=>6
        

        此处列表的大小已从 4 号调整为 3 号。现在索引 0 处的元素是 7。

        接下来,您将转到索引 1 处的元素。这是数字 8。

        Removed Elements=>8
        

        这里 ArrayList 的长度已调整为 2。因此只有索引 0 和 1 处的元素。

        接下来您将进入索引 2。

        Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
            at java.util.ArrayList.RangeCheck(ArrayList.java:547)
            at java.util.ArrayList.remove(ArrayList.java:387)
            at CollectionTemp.main(CollectionTemp.java:19)
        

        没有索引 2,所以你得到一个 IndexOutOfBoundsException。

        【讨论】:

          【解决方案6】:

          索引从 0 开始,以 size - 1 结束

          您的循环从 1 变为 size - 2

          【讨论】:

            【解决方案7】:

            ArrayList 索引从零开始,但您的循环从 1 开始删除。添加元素后,您的数组列表如下所示:

            0 - 6
            1 - 7
            2 - 8
            3 - 9
            

            因为您的循环从 1 开始计数,您将首先删除标记为 1 的元素,即 7。 然后列表将如下所示:

            0 - 6
            1 - 8
            2 - 9
            

            然后循环将删除标记为 2 的元素,现在是 9。

            所以这两个错误是从 1 而不是 0 开始,并在删除某些内容后递增计数器(删除元素之后的所有元素都将向下移动)。

            【讨论】:

              【解决方案8】:

              在第一次迭代中,i 从 1 开始,因此您的第二个元素被删除,即。 7。现在列表有

              6
              8
              9
              

              下一次迭代是 2,所以第三个元素 9 被删除。

              【讨论】:

                【解决方案9】:

                你的输出是正确的:这是解释。

                第一次执行循环时,i 的值将是1。它执行语句a.remove(1)。在删除位于 a[1]、'8will be ata[1] 的位置的值 7 之后。之后,i 递增并变为 2,并删除元素 a[2],即 9

                【讨论】:

                  【解决方案10】:

                  这是一个简单的逻辑:

                  第一次迭代i=1:

                  a[0]=6,
                  a[1]=7,
                  a[2]=8;
                  a[3]=9;
                  

                  删除a[i]a[1] 删除7

                  第二次迭代i=2:

                  a[0]=6
                  a[1]=7
                  a[2]=9
                  

                  删除a[i] 删除9

                  【讨论】:

                    【解决方案11】:

                    循环中i的值经过以下值

                    0 1 2 3 4

                    数组的索引值为 0 , 1 , 2 , 3

                    循环将针对值 0、1、2、3、4 运行

                    当删除一个值时,数组不会按顺序显示,下一个值在索引 0 处可用

                    在 i=2 时,数组的大小为 2 且最大索引为 1 ,因此遇到 IndexOutofBound 异常

                    使用以下循环:

                        while(a.size()>0)
                        {
                         System.out.println("Removed Elements=>"+a.remove(0));
                        } 
                    

                    【讨论】:

                      【解决方案12】:

                      当你从arraylist中删除一个元素时,它会删除指定位置的元素。每次arraylist的大小减小时都应该注意这一点。

                      【讨论】:

                        【解决方案13】:

                        我不明白您要删除什么。如果您想清除列表,只需调用clear() 方法。如果您尝试删除列表中包含的对象,那么您应该知道 ArrayList 包含对象,而不是原始整数。添加它们时,您正在执行以下操作:

                        a.add(Integer.valueOf(6));
                        

                        而且ArrayList中有两个remove方法:

                        remove(Object o) //Removes the first occurrence of the specified element from this list
                        

                        还有你打电话的人:

                        remove(int index) //Removes the element at the specified position in this list
                        

                        也许你应该打电话给第一个:

                         a.remove(Integer.valueOf(i));
                        

                        【讨论】:

                          猜你喜欢
                          • 2021-05-26
                          • 1970-01-01
                          • 2022-11-16
                          • 2022-08-02
                          • 2020-08-03
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2014-05-27
                          相关资源
                          最近更新 更多