【问题标题】:What exactly is wrong with my ArrayList?我的 ArrayList 到底有什么问题?
【发布时间】:2015-06-08 00:13:21
【问题描述】:

我的程序可以编译,但是当我运行它时,它给了我一个IndexOutOfBoundsException。我想知道它有什么问题,因为我看不到它。我的程序应该接受用户的输入并将其添加到 ArrayList。如果我的错误对您来说很明显,我很抱歉,但我在使用 ArrayLists 方面相对较新。谢谢!

ArrayList<ArrayList<Integer>> arr = new ArrayList<ArrayList<Integer>>();
int counter = 0;
int i = 0;
Scanner in = new Scanner(System.in);
int input = in.nextInt();

while(i < 5)
{
    input = in.nextInt();
    if(input != 0){
        arr.get(i).set(counter++, input);
    }
    else{
        arr.get(i).set(counter++, input);
        i++;
        counter = 0;
    }
}

System.out.println(arr);

【问题讨论】:

  • 您永远不会向arr 添加任何内容。当调用空的List 时,您希望arr.get(i) 做什么?
  • 为什么要嵌套数组列表?
  • 你想创建一个没有负数的数组列表吗?

标签: java arraylist indexoutofboundsexception


【解决方案1】:

您正在创建一个列表列表,但两者都是空的。此外,您正在使用“set”方法,该方法实际上用于替换特定位置列表中的对象。

所以看起来你想从用户那里获取输入,如果值为 0 你只是想忽略它。下面是给你的更新示例。

    ArrayList<ArrayList<Integer>> arr = new ArrayList<ArrayList<Integer>>();
    int i = 0;
    Scanner in = new Scanner(System.in);
    int input = 0;
    while(i < 5){
        input = in.nextInt();
        if(input != 0){
            arr.add(new ArrayList<Integer>());
            arr.get(i).add(input);
            i++;
        }

    }

    System.out.println(arr);

如果您只想创建一个整数列表,那么您不需要创建一个列表列表。您可以通过仅创建整数列表来实现。

 ArrayList<Integer>  arr = new ArrayList< Integer >();
    int i = 0;
    Scanner in = new Scanner(System.in);
    int input = 0;
    while(i < 5){
        input = in.nextInt();
        if(input != 0){
            arr.add(input);
            i++;
        }

    }

    System.out.println(arr);

【讨论】:

    【解决方案2】:

    当您创建ArrayLists 中的ArrayList 时,最初arr 中不包含ArrayLists。因此,任何对get 的调用都会以IndexOutOfBoundsException 失败。

    首先,将初始内部ArrayList 添加到arr

    然后,在 while 循环中,get 当前内部 ArrayList 就像你正在做的那样,但只需调用 add 将一个数字附加到列表的末尾。否则,您将在您的内部ArrayList 上获得一个IndexOutOfBoundsException。同样,您创建的 ArrayList 最初是空的。

    当用户输入0,然后add另一个ArrayList,当你递增i(除非i已经是最后一个期望的值),为用户添加数字做准备下一个列表。

    【讨论】:

    • 那么,如果我要进行 ArrayList ArrayList&lt;ArrayList&lt;Integer&gt;&gt; arr = new ArrayList&lt;ArrayList&lt;Integer&gt;&gt;(5); 的初始创建,那会起作用吗?因为我仍然收到 IndexOutOfBoundsError。
    • 不,这只是将外部 ArrayList 的初始 容量 设置为 5。如果您只对代码进行该更改,那么仍然不会是外部ArrayList 中的任何东西。您可以根据需要进行更改,但您仍然需要在我的答案中进行更改。
    猜你喜欢
    • 2010-09-30
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 2018-06-23
    • 2011-05-03
    • 1970-01-01
    相关资源
    最近更新 更多