2013-03-16 90 views
0
import java.util.*; 

    class A 
    { 
     private ArrayList <B> bList; 
     private Random generator = new Random(); 

     A(List<B> initialList) 
     { 
      bList = new ArrayList<B>(); 
      int listSize = initialList.size(); 
      bList.ensureCapacity(listSize); 

      for (B b : initialList) 
      { 
       int bIndex = generator.nextInt(listSize); 
       bList.add(bIndex , b); 
      } 
     } 
    } 

    class B 
    { 
    } 

的我結束了一個新的錯誤是一個超出範圍的錯誤當我插入blist.add(bIndex , b);Java列表錯誤超出範圍

調試看來的ensureCapacity沒有完成其工作之後。

+0

究竟你在做什麼?按隨機順序排序initialList? – BlackJoker 2013-03-16 05:41:39

+0

你應該在這裏發佈堆棧跟蹤。 – 2013-03-16 05:48:02

+0

嗯......不知道你想用'ensureCapacity'完成的任務。你在做類似[這]東西(http://stackoverflow.com/questions/7688151/java-arraylist-ensurecapacity-not-working)? – user1766760 2013-03-16 05:51:10

回答

2

看那add方法的文檔:

IndexOutOfBoundsException - 如果索引超出範圍(index < 0 ||指數>尺寸())

它不會使感覺將一個元素放入列表中可能導致列表中的空洞的位置。

ensureCapacity只是讓空間等多種元素。這並不意味着他們真的在那裏。

隨着這一變化它應該工作:

int bIndex = generator.nextInt(bList.size()+1); 
0

容量從大小不同。您需要確保新列表具有足夠的內部容量以用於呼叫add的索引,但是您可以撥打add,索引(可能且可能)大於列表的size

0

你會隨機得到這個錯誤。因爲您使用隨機類創建索引(bIndex)。它會用你提到的列表大小生成索引(int bIndex = generator.nextInt(listSize))。有時它會生成大於0的隨機數。那時你會得到這個錯誤。如果它創建0,那麼它不會給出錯誤。

可以使用for循環,而不是的foreach。

for (int i = 0; i < listSize; i++) { 
    B b = initialList.get(i); 
    bList.add(i, b); 
    System.out.println(bList.toString()); 
}