-3
import java.util.*;
class Drive{
    public static void main(String[] args) {
        ArrayList<String> lstStr = new ArrayList<String>();
        lstStr.add("A");
        lstStr.add("R");
        lstStr.add("C");
        String str;
        for(Iterator<String> it = lstStr.iterator(); it.hasNext();) {   
            str = it.next();
            if(str.equals("R")) {
                lstStr.remove(it);
            }
        }
        for(Iterator<String> it = lstStr.iterator(); it.hasNext();) {
            System.out.println(it.next());
        }
    }
}

何が起こっているのか理解できませんでした。なぜ R が ArrayList から削除されていないのですか?

4

3 に答える 3

3
if(str.equals("R"))
    lstStr.remove(it);

上記は次のとおりです。

if(str.equals("R"))
    it.remove();
于 2013-04-14T08:29:44.910 に答える
2

Iteratorから何かをList安全に削除したい場合は、 の remove メソッドを使用してください。API に従って、void remove(): 基になるコレクションから、反復子によって返された最後の要素を削除します (オプションの操作)。このメソッドは、next への呼び出しごとに 1 回だけ呼び出すことができます。反復の進行中に、このメソッドを呼び出す以外の方法で基になるコレクションが変更された場合、反復子の動作は規定されていません。

あなたのコードにはマイナーな修正が必要です:

for(Iterator<String> it = lstStr.iterator(); it.hasNext();)
{ 
    str = it.next();
    // instead of iterator "it" put string "str" as argument to the remove()
    if(str.equals("R")){lstStr.remove(str);}
 }

上記のコードはあなたのケースでは機能しますが、失敗するエッジケースがたくさんあります。これを行う最良の方法は次のとおりです。

for(Iterator<String> it = lstStr.iterator(); it.hasNext();)
{ 
    str = it.next();
    // use iterator's remove()
    if(str.equals("R")){ it.remove();}
 }
于 2013-04-14T08:37:29.443 に答える
1

次のようにイテレータの remove メソッドを使用します。

List<String> lstStr = new ArrayList<String>();
lstStr.add("A");
lstStr.add("R");
lstStr.add("C");
String str;

for(Iterator<String> it = lstStr.iterator(); it.hasNext();)
{ 
    str = it.next();
    if(str.equals("R"))
    {
        it.remove();
    }
}

for(Iterator<String> it = lstStr.iterator(); it.hasNext();)
{
    System.out.println(it.next());
}

このクラスの iterator および listIterator メソッドによって返される反復子はフェイルファストです。反復子の作成後に、反復子 自体の remove または add メソッド以外の方法でリストが構造的に変更された場合、反復子は ConcurrentModificationException をスローします。

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

于 2013-04-14T08:34:22.447 に答える