我正在尝试构建一个间隔树。在这部分中,我必须按升序排列所有左端点,并按升序排列所有右端点,并将它们放在单个点的列表中(不重复)。但是,当我尝试将右端点合并到点列表中时,我不断收到indexOutOfBounds异常。我确保了容量,这样就不会发生,但无论如何都会发生。我在这里不理解什么?
public static ArrayList<Integer> getSortedEndPoints(ArrayList<Interval> leftSortedIntervals, ArrayList<Interval> rightSortedIntervals) {
ArrayList<Integer> result = new ArrayList<Integer>();
for (int i = 0 ; i < leftSortedIntervals.size() ; i++ ) {
if (i >= 1 && leftSortedIntervals.get(i-1).leftEndPoint != leftSortedIntervals.get(i).leftEndPoint ) {
result.add(leftSortedIntervals.get(i).leftEndPoint);
}
else if (i == 0) {
result.add(leftSortedIntervals.get(i).leftEndPoint);
}
}
result.ensureCapacity(rightSortedIntervals.size()*2);
for (int j = 0 ; j < rightSortedIntervals.size(); j++) {
boolean duplicate = false;
int size = result.size()-1;
int temp = rightSortedIntervals.get(j).rightEndPoint;
while (size >= 0 && result.get(size) >= rightSortedIntervals.get(j).rightEndPoint ) {
if (result.get(size) == rightSortedIntervals.get(j).rightEndPoint) {
duplicate = true;
break;
}
else {
result.set(size+1, result.get(size));
size--;
}
}
if (duplicate = true) {
continue;
}
else {
result.add(size, temp);
}
}
return result;
}
此行发生错误:
else {
result.set(size+1, result.get(size));
size--;
}
答案 0 :(得分:2)
你有:
int size = result.size() - 1;
// ...
result.set(size + 1, result.get(size));
size--;
因此,每次都会出现错误:在第一次迭代时,size + 1 == result.size()
因此您无法调用result.set(size+1, anything)
答案 1 :(得分:0)
ensureCapacity不会按照您的想法行事。
ArrayList有两个不同的值,大小和容量。容量是基础阵列中的存储量,但不会向用户公开。大小是集合中考虑的元素数量,这与它交互时很重要。
容量函数存在的唯一原因是因为如果您事先知道要使用多少个元素,那么增加容量可以让您添加元素而不会进行可能缓慢的数组重新分配。