0

だから私は私が書いているいくつかのコードで範囲外のインデックスの例外を取得しています。私が理解していないのは、私が操作しようとしているインデックス要素が存在するという事実を知っているということです。

コードは次のとおりです。

配列リストのコンストラクターがあります

    public StixBoard(int number)
{
    stixGame = new ArrayList<Integer>(number);

    for (int i = 0; i < number; i++)
    {
        stixGame.add(i);
    }

}

このブロックは確率変数1〜3を生成します

public int computeMove()
{

    int numberOfStix = (int) (3.0 * Math.random()) + 1;

    return numberOfStix;
}

本当に簡単です。ここに、指定されたパラメーターを受け取り、それらの数の要素を配列リストから削除しようとするメソッドがあります。ご覧のとおり、パラメーターは1〜3である必要があり、配列リストのサイズ以下である必要があります。それ以外の場合、ユーザーは別の番号を入力するように求められます

public boolean takeStix(int number)
{
    boolean logicVar = false;
    placeHolder = stixGame.size();

    if ((number >= 1 && number <= 3) && number <= placeHolder)
    {
        for (int i = 0; i < number; i++)
        {
            stixGame.remove(i);
            logicVar = true;
        }
    } else if (number > 3 || number > placeHolder)
    {
        do
        {
            System.out
                    .println("Please enter a different number, less than or equal to three.");
            Scanner numberScan = new Scanner(System.in);
            number = numberScan.nextInt();
        } while (number > 3 || number > placeHolder);
    }

    return logicVar;
}

したがって、このプログラムが実行されると、computeMove()メソッドはランダムなintを生成し(コンピューター化されたプレーヤーの役割を想定)、その値を配列リストから削除するインデックスの数に変換しようとします。

これは最終的に私にこれをもたらします:

How many stix on the table? 4
|||||||||| 4 stix on the table
It's the computer's turn!
The computer chose 3

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.remove(ArrayList.java:387)
at StixBoard.takeStix(StixBoard.java:38)
at StixGame.main(StixGame.java:55)

ご覧のとおり、配列リストのサイズは4ですが、コンピューターが3をロールすると(1が残るはずです)、このエラーが残ります。配列リストはどのようにしてサイズ4のインデックスからサイズ2になりますか?

4

3 に答える 3

6

リストを最初から最後まで反復処理し、各ステップで要素を削除します。これにより、リスト内のすべての要素が左にシフトします。

最初の反復: i = 0

[1, 2, 3]

2 回目の反復: i = 1

[2, 3]

3 回目の反復: i = 2

[2] -> IndexOutOfBoudsException. There is no index 2 in this list.

代わりに、最初から最後まで繰り返します。これにより、リストがすべての要素を右から左にコピーする必要がないため、正しく、高速になります。

于 2012-12-07T21:23:09.470 に答える
2

問題はこのループにあります:

    for (int i = 0; i < number; i++)
    {
        stixGame.remove(i);
        logicVar = true;
    }

要素を削除すると、リストのサイズも小さくなります。リストサイズ3から始めて、3回目の反復で、インデックスはになり2 as initially 0 then 1 then 2、サイズはになり1 as intially 3 then 2 then 1ます。したがってIndexOutOfBoundException

これを試して:

    for (int i = 0; i < number; i++){
        stixGame.remove(0);//remove 0th index as previous element was removed
        logicVar = true;
    }
于 2012-12-07T21:22:09.027 に答える
0

このように見てください。

for ループを開始すると、ArrayList は size になりxます。

呼び出すときremove()は、リストから要素を取得します。なのでサイズはx-1.

しかし、削除する要素を常に増やしていくと、最終的には存在しなくなったインデックスを削除することになります。呼び出すとremove()、配列リストの内容がシフトされることに注意してください。したがって、前に 0,1,2,3 があり、2 を削除した場合、リストは 0,1,3 です。最初に有効だったものを呼び出すremove(4)と、範囲外の例外が発生します

于 2012-12-07T21:26:51.753 に答える