11

ArrayList に整数を追加し、その整数を ArrayList から削除する Java プログラムを作成しました。しかし、それは私に適切な結果を与えません。ここに私のコードがあります..

public static void main(String args[])
  {
    ArrayList<Integer> a=new ArrayList<Integer>();

    a.add(6);
    a.add(7);
    a.add(8);
    a.add(9);

    for(int i=0;i<=a.size();i++)
    {

        System.out.println("Removed Elements=>"+a.remove(i));
    }
  }

次のような出力が得られます

    Removed Elements=>6
Removed Elements=>8
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 CollectionTemp.main(CollectionTemp.java:19)

なぜ私はこのような出力を得ているのですか?

4

13 に答える 13

9

最初の反復では、メソッドa.remove(i)によって返される要素 7 が削除されremoveます。

2 回目の反復では、リストのサイズは 3 で、インデックス 2 の 9 の要素を削除しています。SO remove メソッドは 9 を返します。

要するに

Iteration | Size of list | index being removed | element removed
----------+--------------+---------------------+----------------
    1     |      4       |          1          |       7   
    2     |      3       |          2          |       9  
于 2013-08-28T12:13:25.477 に答える
9

フォワード ループですべての要素を削除する場合は、次のコードを使用できます。

while(!a.isEmpty())
{
    System.out.println("Removed Elements=>" + a.remove(0));
}
于 2013-08-28T12:37:37.317 に答える
4

問題は、要素を削除すると、ArrayList のサイズが変更されることです。ただし、ループ カウンターは更新されないため、ArrayList の境界を超えて反復します。

ArrayList.remove(index)は、ArrayList の内容だけでなく、配列から要素を削除しますが、アイテムを削除すると、実際には ArrayList のサイズが変更されます。

まず、ArrayList の最初の要素を削除します。

Removed Elements=>6

ここでは、リストのサイズが 4 から 3 に変更されています。現在、インデックス 0 の要素は 7 です。

次に、インデックス 1 の要素に進みます。これは番号 8 です。

Removed Elements=>8

ここで、ArrayList は長さ 2 にサイズ変更されています。したがって、インデックス 0 と 1 の要素のみがあります。

次に、インデックス 2 に進みます。

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 CollectionTemp.main(CollectionTemp.java:19)

インデックス 2 がないため、IndexOutOfBoundsException が発生します。

于 2013-08-28T12:30:18.457 に答える
0

arraylist から要素を削除するたびに、指定された場所の要素が削除されます。これは、arraylist のサイズが減少するたびに注意する必要があります。

于 2013-08-29T08:03:51.490 に答える
0

何を削除しようとしているのかわかりません。リストをクリアしたい場合は、clear()メソッドを呼び出すだけです。リストに含まれるオブジェクトを削除しようとしている場合は、ArrayList にはプリミティブ int ではなくオブジェクトが含まれていることを知っておく必要があります。それらを追加すると、次のことが行われます。

a.add(Integer.valueOf(6));

また、ArrayList には 2 つの remove メソッドがあります。

remove(Object o) //Removes the first occurrence of the specified element from this list

そしてあなたが呼んでいるもの:

remove(int index) //Removes the element at the specified position in this list

最初に電話する必要があるかもしれません:

 a.remove(Integer.valueOf(i));
于 2013-08-31T09:17:53.590 に答える
0

インデックスは 0 で始まり、サイズ - 1 で終わります

あなたのループは1からサイズ - 2になります

于 2013-08-28T12:13:48.193 に答える
0

これは単純なロジックです。

最初の繰り返しi=1:

a[0]=6,
a[1]=7,
a[2]=8;
a[3]=9;

削除する、a[i]つまりa[1]削除する7

2 回目の繰り返しi=2:

a[0]=6
a[1]=7
a[2]=9

削除a[i]する9

于 2013-08-28T12:17:47.020 に答える
0

ループ内の i の値は、次の値を通過します

0 1 2 3 4

配列には、値 0 、 1 、 2 、 3 のインデックスがあります

ループは値 0、1、2、3、4 に対して実行されます

1 つの値が削除された場合、配列は順序付けされた bcoz で表示されません。次の値はインデックス 0 で使用できます。

i=2 では、配列のサイズは 2 で、最大インデックスは 1 であるため、 IndexOutofBound 例外が発生します。

次のループを使用します。

    while(a.size()>0)
    {
     System.out.println("Removed Elements=>"+a.remove(0));
    } 
于 2013-08-28T17:50:45.503 に答える
0

あなたの出力は正しいです:ここに説明があります。

ループが初めて実行されるとき、 の値はiになります1。そしてステートメントを実行しa.remove(1)ます。場所 a[1] にある値を削除した後7、'8 will be ata[1] の場所。その後iがインクリメントされて 2 になり、 である要素a[2]を削除し9ます。

于 2013-08-28T12:17:52.067 に答える