2013-03-13 3 views
0

나는 간격 나무를 만들려고합니다. 이 부분에서는 모든 왼쪽 끝점을 오름차순으로, 모든 오른쪽 끝점을 오름차순으로 가져와 단일 지점 목록에 배치해야합니다 (중복되지 않음). 그러나 오른쪽 끝점을 지점 목록에 병합하려고하면 indexOutOfBounds 예외가 계속 발생합니다. 나는 이것이 일어날 수 없도록 능력을 확보했지만 어쨌든 그것은 일어난다. 나는 여기서 무엇을 이해하지 못 하겠는가?Arraylist 던지고 계속 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--; 
     } 

답변

2

들 :

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

따라서 오류가 매번 발생합니다 : 첫 번째 반복에서, size + 1 == result.size() 그래서 당신이 result.set(size+1, anything)

를 호출 할 수 없습니다
+0

정말인가요? 크기는 단지 정수 값입니다 (내가 아는 가난한 명명법). 여기에서 나는 삽입 할 끝점을위한 공간을 만들기 위해 모든 것을 실제로 오른쪽으로 옮기고 있습니다. – biohax2015

+0

예 확신합니다 : http://docs.oracle.com/javase/6/docs/api/java/util/List.html#set(int,E) : IndexOutOfBoundsException - 인덱스가 범위를 벗어난 경우 (index <0 || 인덱스> = size()) –

0

sureCapacity는 귀하가 생각하는대로하지 않습니다.

ArrayList에는 크기와 용량의 두 가지 값이 있습니다. 용량은 기본 배열의 저장소 크기이지만 사용자에게 노출되지 않습니다. 크기는 컬렉션에서 고려되는 요소의 수이며, 이것과 상호 작용할 때 중요한 요소입니다.

용량 기능이 존재하는 유일한 이유는 이전에 얼마나 많은 요소를 사용했는지 알고 있다면 용량을 늘리면 느린 어레이 재 할당없이 요소를 추가 할 수 있기 때문입니다.

관련 문제