2013-03-13 56 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 2013-03-13 19:53:08

+0

是的,我確定:http://docs.oracle.com/javase/6/docs/api/java/util/List.html#set(int,E):IndexOutOfBoundsException - 如果索引超出範圍(索引<0 || index> = size()) – 2013-03-13 19:55:06

0

ensureCapacity不會做你認爲它做的事情。

ArrayList有兩個不同的值,大小和容量。容量是底層數組中的存儲量,但不會向用戶公開。大小是集合中考慮的元素的數量,當與它進行交互時,這是重要的。

容量函數存在的唯一原因是因爲如果您事先知道要使用的元素數量,增加容量可讓您添加元素,而不會潛在地減慢數組重新分配。