2

このエラーが発生し続けます:

java.lang.IndexOutOfBoundsException: インデックス: 3、サイズ: 3

文字列「Meg」を削除しようとしていますが、コンパイルされますが、このエラーが発生し続けます。

import java.util.ArrayList;

public class CustomerLister2 {
    public static void main (String[] args) {

        ArrayList<String> name = new ArrayList<String>();

        name.add("Chris");
        name.add("Lois");
        name.add("Meg");
        name.add("Meg");
        name.add("Brain");
        name.add("Peter");
        name.add("Stewie");

        for ( int i = 0;  i < name.size(); i++){
            name.get(i);
            name.remove(i);
            name.set(i,"Meg");
        }

        for(String names: name){
            System.out.println(names);
        }
    }
}
4

5 に答える 5

2

その場合の呼び出しremove()は、set()おそらくあなたがやりたいことではありません。たぶんset()、削除せずに、そのインデックスにある既存の要素を上書きするために呼び出すだけですか?

Remove はリストから要素を削除し、add は要素を追加します。set は、指定されたインデックスが存在する場合にのみ機能します。

for ( int i = 0;  i < name.size(); i++){
    String oldName = name.get(i);
    name.set( i, "Meg");
}
于 2013-10-19T01:08:04.760 に答える
1

ArrayList は可変サイズです。name.remove(i) を実行すると、リストが小さくなります。次に、存在しないインデックスに要素を設定しようとします。name.remove(i) または name.set(i, "Meg") を name.add(i, "Meg") に変更する必要はありません。

http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

編集

また、コードがインデックス i のすべての要素を削除していることにも注意してください。これがおそらく、毎回インデックス 3 で例外が発生する理由です。要素 0 を削除すると、リストが小さくなります。次に、要素 1 を削除すると、リストが小さくなります。for ループで i == 3 に到達し、リストに含まれる要素が 3 つになるまで、これを繰り返します。

于 2013-10-19T01:08:35.970 に答える
0

Remove(index) は項目を削除し、残りの項目を 1 つ上に移動します。

i=0 の場合、ループシーンの後 -

クリスが削除されました。
0 メガ (lois に上書き)
1 メガ
2 メガ
3 脳
4 ピーター
5 ステウェイ

i=1 の場合、ループ シーンの後は
0 メガ
(メガは削除されたインデックスがシフトされます)
1 メガ (最後のメガに上書きされます)
2 脳
3 ピーター
4 ステウェイ

for i=2 ループ後
0 メガ
1 メガ
(脳削除、インデックスシフト)
2 ピーター
3 ステウェイ

for i=3 stewei 削除時
0 メガ
1 メガ
2 ピーター

インデックス 3 が利用できません....したがって、エラーが発生します。

于 2013-10-19T01:27:28.820 に答える