2

名前、電話番号、場所の配列リストがあります。

可能であれば、その配列から特定のアイテムを削除したい

以下で試したように、アイテムを見つけたら削除する方法はありますか?

public void delete(String nameToDelete) 
{    
    for (Entry entry : Directory.entries) { 
        if (entry.name.equalsIgnoreCase(nameToDelete))
        {
            //remove(entry);
        }
    }
}

ありがとう

4

3 に答える 3

2

理由?

ArrayListによって返されるイテレータは本質fail-fast的です。

このクラスの反復子とlistIteratorメソッドによって返される反復子はfail-fas次のとおりです。反復子が作成された後、反復子自体の remove メソッドまたは add メソッド以外の方法でリストが構造的に変更された場合、反復子はConcurrentModificationException. したがって、同時変更に直面した場合、反復子は、将来の不確定な時点で恣意的で非決定論的な動作を危険にさらすのではなく、迅速かつ明確に失敗します。

この反復子は、使用していないときにどこから来るのですか?

コレクションの強化された for ループIteratorが使用されるため、反復中に remove メソッドを呼び出すことはできません。

したがって、ループは以下と同じです

for (Iterator<Entry> i = c.iterator(); i.hasNext(); ){   

解決策は何ですか?

iterator.remove();暗黙的ではなく明示的に反復子に基づいてループを呼び出して変更できます。

    String inputWord = "john";
    ArrayList<String> wordlist = new ArrayList<String>();
    wordlist.add("rambo");
    wordlist.add("john");
    for (ListIterator<String> iterator = wordlist.listIterator(); iterator
            .hasNext();) {
        String z = iterator.next();
        if (z.equals(inputWord)) {
            iterator.remove();
        }
    }
    System.out.println(wordlist.size());

どこでもっと読むことができますか?

  1. For-Each ループ
  2. ArrayList Java ドキュメント
于 2012-10-27T15:10:42.637 に答える
1

Iteratorリストからエントリを削除するには、を使用する必要があります。List強化された for ループを使用して反復しながら変更しようとすると、 ConcurrentModificationExceptionがスローされる場合がありますが、これは常に発生するわけではありませんが、保証はありません。

リストに使用する方法は次のIteratorとおりです。 -

Iterator<Entry> iterator = Directory.entries.iterator();

while (iterator.hasNext()) {
    Entry entry = iterator.next();

    if (entry.name.equalsIgnoreCase(nameToDelete)) {
        iterator.remove();
    }
}

であっても、メソッドではなくメソッドをIterator使用して要素を削除する必要があります。それは違いがないからです。iterator.removelist.remove

ListIteratorを使用して、さらに多くの操作とメソッドを使用してリストを反復することもできます。詳細については、ドキュメントを参照してください。

を使用するにはListIterator、次のように作成できます。

ListIterator<Entry> listIterator = Directory.entries.listIterator();

残りのコードは同じように機能します。

于 2012-10-27T15:03:18.067 に答える
0

あなたがすることはif entry.getKey().equals(nameToDelete)、それがあなたが望むものであるかどうかを確認するために使用し、remove()メソッドを使用してそのエントリを削除することです。

for()ただし、変更している同じコレクションを反復するループ内でこれを行うことはできません。ConcurrentModificationExceptionが発生します。

「イテレータの使用時に ConcurrentModificationException を回避する方法」を参照してください。

于 2012-10-27T15:01:09.593 に答える