【问题标题】:get an error though proper initialized arraylist in java尽管在 java 中正确初始化了 arraylist,但得到一个错误
【发布时间】:2020-05-22 13:54:37
【问题描述】:

我想在arraylist中传递值,并初始化好。但是有一个错误 -

线程“主”java.lang.IndexOutOfBoundsException 中的异常:索引:3,大小:0

我正在努力,这是我的代码 -


      public static void main(String[]args)
        {
            int n = 3;
            ArrayList<ArrayList<Integer>> graph = new ArrayList<>(n+2);
            for(int i=0; i < n+2 ; i++) {
                graph.add(new ArrayList<>(n+2));
            }
            graph.get(1).add(3,9);
            graph.get(2).add(3,1);
            graph.get(1).add(2,5);

            int s = 1, d = 3;
            System.out.println(dijkstra(s,d,graph));
        }

【问题讨论】:

    标签: java arraylist


    【解决方案1】:

    您使用 容量 = n + 2 初始化 ArrayList,但 ArrayList 在首次创建时仍为空。容量与大小不同。

    容量
    在不分配任何额外内存的情况下可以添加到 ArrayList 的元素数
    尺寸
    ArrayList中实际存储的元素个数


    您对ArrayList::add 的调用引发了越界异常,因为空的 ArrayList 无法在索引 = 3 处插入值。根据定义,添加到任何 ArrayList 的第一个值的索引 = 0。

    您为什么要尝试在特定索引处插入值?解决方案将取决于您这样做的原因。

    编辑:解决方案

    当您创建 ArrayList 时,使用所有值 = 0 的 n + 2 条目对其进行初始化。

    ...
    ArrayList<ArrayList<Integer>> graph = new ArrayList<>(n+2);
    for(int i=0; i < n+2 ; i++) {
        ArrayList<Integer> sublist = new ArrayList<>(n+2);
        for (int j = 0; j < n + 2; j++) {
            sublist.add(0);
        }
        graph.add(sublist);
    }
    ...
    

    其余部分保持不变,它将按预期运行。

    【讨论】:

    • 我想传递图形的顶点、边和值
    • @DipChakraborty 查看我添加的解决方案
    【解决方案2】:

    问题:

    以下行表示在索引处添加9 3

    graph.get(1).add(3,9);
    

    但是,graph.get(1) 返回一个空的 ArrayList&lt;Integer&gt;。这就是您收到以下错误的原因:

    Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 0
    

    解决方案:

    替换

    graph.get(1).add(3,9);
    

    graph.get(1).add(9);
    

    它将在添加元素的最后一个索引之后添加元素(例如,在这种情况下为9)。在这种情况下,9 将被添加到索引 0

    [更新]

    或者,您可以按如下方式初始化内部列表:

    for(int i=0; i < n+2 ; i++) {
        List<Integer> list = new ArrayList<>();
        for(int j = 0; j< n+2; j++){
            list.add(0);
        }
        graph.add(list);
    }
    

    然后你可以继续如下(你已经做过的方式):

    graph.get(1).add(3,9);
    graph.get(2).add(3,1);
    graph.get(1).add(2,5);
    

    [另一个更新]

    下面给出的是基于Andy Turner's comment的简洁方式:

    for (int i = 0; i < n + 2; i++) {
        graph.add(new ArrayList<>(Collections.nCopies(n + 2, 0)));
    }
    

    【讨论】:

    • 我要取两个索引
    • @DipChakraborty - 在这种情况下,您需要使用一些值初始化内部列表。
    • 能帮忙怎么办吗?
    • @DipChakraborty - 我已经更新了我的答案以满足这个要求。如有任何疑问/问题,请随时发表评论。
    • new ArrayList&lt;&gt;(Collections.nCopies(n+2, 0)) 是“或者,您可以初始化”的更简洁的方式。
    猜你喜欢
    • 2013-06-22
    • 2021-11-27
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 2013-10-29
    相关资源
    最近更新 更多