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呼び出します。addsize

于 2013-03-16T05:50:57.850 に答える
0

このエラーはランダムに発生します。ランダムクラスを使用してindex(bIndex)を作成するためです。それはあなたが言及したリストサイズ(int bIndex = generator.nextInt(listSize))でインデックスを生成します。0より大きい乱数が生成される場合があります。その場合、このエラーが発生します。0を作成すると、エラーは発生しません。

foreachの代わりにforループを使用できます。

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 に答える