2013-03-16 92 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()); 
}