用初始容量重新初始化ArrayList

时间:2020-11-11 05:17:28

标签: java arraylist instantiation

我已经有两个顶点的ArrayList,它们基本上是一个图形数据结构。第一个是顶点或交叉点,第二个是边缘,称为道路。当我知道图中有多少个顶点/边时,我试图重新实例化它们。

int line = 0;
        while(reader.hasNextLine()){
            String thisLine = reader.nextLine();
            System.out.println(thisLine + " line: " + line);
            if(line == 0){

                numIntersections = Integer.parseInt(thisLine.split("\\s+")[0]);
                intersections = new ArrayList<Intersection>(numIntersections);
                System.out.println("numIntersections: " + numIntersections + " intersections size: " + intersections.toArray().length);
                numRoads = Integer.parseInt(thisLine.split("\\s+")[1]);
                roads = new ArrayList<Road>(numRoads);
            }
            else if(line > 0 && line < numIntersections + 1){
                int first = Integer.parseInt(thisLine.split("\\s+")[0]);
                int second = Integer.parseInt(thisLine.split("\\s+")[1]);
                int third = Integer.parseInt(thisLine.split("\\s+")[2]);
                intersections.add(first, new Intersection(second, second, third));
            }
            else if(line > numIntersections + 1){
                roads.add(new Road(intersections.get(Integer.parseInt(thisLine.split("\\s+")[0])), intersections.get(Integer.parseInt(thisLine.split("\\s+")[1]))));
                intersections.get(Integer.parseInt(thisLine.split("\\s+")[0])).addNeighbor(intersections.get(Integer.parseInt(thisLine.split("\\s+")[1])));
            }
            line++;
        }

您可以在第一个if语句中看到numIntersections时重新实例化ArrayList。当我知道道路数量时,我也会这样做。

但是,当我尝试在第一个else if语句中向列表中添加新的交集时,它会抛出界外异常。因为容量设置为numIntersections,所以不应发生这种情况。

1 个答案:

答案 0 :(得分:1)

容量不等于容量。

新创建的容量为10的ArrayList将具有一个支持分配10个元素的后备数组,但其大小仍为零。对ArrayList中的任何元素进行寻址都会导致IndexOutOfBoundsException,尽管add()方法将使您可以在索引0处添加元素。

ArrayList.add()方法的Javadoc指出:

抛出:

IndexOutOfBoundsException-如果索引超出范围(index < 0 || index > size())

This answer显示了如何使用特定数量的值初始化ArrayList