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);

调试后,ensureCapacity 似乎没有完成它的工作。

4

3 回答 3

2

查看add方法的文档:

IndexOutOfBoundsException - 如果索引超出范围 (index < 0 || index > size())

将元素放入列表中会导致列表出现漏洞的位置是没有意义的。

ensureCapacity只是为这么多元素腾出了空间。这并不意味着他们真的在那里。

通过此更改,它应该可以工作:

int bIndex = generator.nextInt(bList.size()+1);
于 2013-03-16T05:48:32.117 回答
0

容量与大小不同。您确保新列表有足够的内部容量来容纳您用于add调用的索引,但随后您调用add的索引(可能和可能)大于列表的size.

于 2013-03-16T05:50:57.850 回答
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());
}
于 2013-03-16T06:12:42.387 回答