0

区間木を作ろうとしています。このパートでは、すべての左側のエンドポイントを昇順で、すべての右側のエンドポイントを昇順で取得し、それらを単一のポイントのリストに配置する必要があります(重複はありません)。ただし、適切なエンドポイントをポイントリストにマージしようとすると、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--;
        }
4

2 に答える 2

2

あなたが持っている:

int size = result.size() - 1;
// ...
result.set(size + 1, result.get(size));
size--;

したがって、エラーは毎回発生します。最初の反復で、size + 1 == result.size()呼び出すことはできません。result.set(size+1, anything)

于 2013-03-13T19:48:48.843 に答える
0

sureCapacityは、あなたが思っていることをしません。

ArrayListには、サイズと容量の2つの異なる値があります。容量は、基盤となるアレイのストレージの量ですが、これはユーザーには公開されません。サイズはコレクションで考慮される要素の数であり、これはコレクションと対話するときに重要です。

容量関数が存在する唯一の理由は、使用する要素の数が事前にわかっている場合、容量を増やすと、配列の再割り当てが遅くなる可能性なしに要素を追加できるためです。

于 2013-03-13T19:50:45.227 に答える