当前位置: 首页 > 知识库问答 >
问题:

在java中正确初始化数组列表时出错

汪泓
2023-03-14

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

线程“main”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));
        }

共有2个答案

吕修伟
2023-03-14

以下行表示在索引处添加 93

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

但是, graph.get(1) 返回一个 ArrayList

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

取代

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

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

这将在已经添加元素的最后一个索引之后添加元素(例如,在这种情况下为< code>9)。在这种情况下,将在索引< code>0处添加< code>9。

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

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);

下面给出的是基于安迪·特纳评论的简洁方式:

for (int i = 0; i < n + 2; i++) {
    graph.add(new ArrayList<>(Collections.nCopies(n + 2, 0)));
}
郎长卿
2023-03-14

初始化 ArrayList 时容量 = n 2,但首次创建 ArrayList 时它们仍然是空的。容量与大小不同。

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

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

编辑:解决方案

创建ArrayList时,用< code > n ^ 2 个条目初始化它,所有条目的值都为0。

...
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);
}
...

保持其余的相同,它将按照所需的方式运行。

 类似资料:
  • 问题内容: 如果没有明确指出它是String [],那么第一次调用someMethod怎么不编译? 使用数组初始化器创建String []数组很好,但是不能使用它传递参数。花括号是否以其他方式用于传递参数,从而使我期望其表现出轨? 编译器错误如下: Moo类型的someMethod(String [])方法不适用于参数(字符串,字符串,字符串) 问题答案: 您只能在声明数组变量或在数组创建表达式(

  • 第一行代码是什么意思?它如何调整数组大小?第二行代码如何初始化该字节数组(如果是)?

  • 问题内容: 我有这个代码 有人可以告诉我我在这里到底在做什么错,我该如何纠正?我只需要将所有数组元素初始化为布尔型false。谢谢 问题答案: 我只需要将所有数组元素初始化为布尔型false。 请改用任一方法,以便所有值默认为: 或者 使用填充整个数组: 另请注意,数组索引基于零。该行如你有会导致。要了解有关Java中数组的更多信息,请查阅此基本Oracle教程。

  • 问题内容: 我正在初始化这样的数组: NetBeans在此行指出一个错误: 我该如何解决这个问题? 问题答案: 上面的信息不正确(语法错误)。这意味着你正在分配一个仅可容纳元素的数组。 如果要初始化数组,请尝试使用: 注意两个声明之间的区别。将新数组分配给声明的变量时,new必须使用。 即使你纠正了语法,访问仍然是不正确的(你只能访问,因为Java中的数组索引是基于0的)。访问]将抛出。

  • 问题内容: 数组初始化列表中使用的逗号分隔符可以以C结束列表,这在 Kernighan&Ritchie编写的C编程语言第二版中 有所提及。 例如 当列表很长时,这很方便,并且不想在添加项目时更改/检查上一行 但是,在Java中,我可以观察到两种不同的行为: 在Eclipse中,当某些版本的maven编译器插件抱怨并引发编译错误时,结尾被接受。 但是,在 Flanagan的Java 书中我没有提到任

  • 问题内容: 我知道当我初始化一个char数组时: 要么 为什么不喜欢 初始化数组: 为什么它们不同?它是Java哲学的本质之一还是其​​背后的某些原因? 问题答案: 如果您曾经使用过 C ,那么答案就非常简单。在 C语言中 ,创建数组的方式是在堆栈上分配一个足以容纳元素数量的静态内存长度,并使用指针指向第一个元素-或堆上动态内存长度,然后用指针指向第一个元素。 在 C ++中 ,第二个版本已更改为