用初始容量重新实例化 ArrayList
Reinstantiating ArrayList with initial capacity
对于基本上是图形数据结构的顶点,我已经有了两个 ArrayList。第一个是顶点或交叉点,第二个是边,称为道路。当我知道图中有多少 vertices/edges 时,我正在尝试重新实例化它们。
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。
容量不等于大小。
新创建的容量为 10 的 ArrayList
将有一个支持数组,允许分配 10 个元素,但其大小仍为零。寻址 ArrayList
中的任何元素将导致 IndexOutOfBoundsException
,尽管 add()
方法将允许您在索引 0.
处添加元素
正如 ArrayList.add()
方法的 Javadoc 所述:
Throws:
IndexOutOfBoundsException
- if the index is out of range (index < 0 || index > size())
This answer 显示如何使用特定数量的值初始化 ArrayList
。
对于基本上是图形数据结构的顶点,我已经有了两个 ArrayList。第一个是顶点或交叉点,第二个是边,称为道路。当我知道图中有多少 vertices/edges 时,我正在尝试重新实例化它们。
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。
容量不等于大小。
新创建的容量为 10 的 ArrayList
将有一个支持数组,允许分配 10 个元素,但其大小仍为零。寻址 ArrayList
中的任何元素将导致 IndexOutOfBoundsException
,尽管 add()
方法将允许您在索引 0.
正如 ArrayList.add()
方法的 Javadoc 所述:
Throws:
IndexOutOfBoundsException
- if the index is out of range(index < 0 || index > size())
This answer 显示如何使用特定数量的值初始化 ArrayList
。