0

私はArrayListを持っていて、arraylistから要素を削除したいJavaコードを持っています。

   ArrayList <word> wordlist=new ArrayList<>();

   public void removeWord(String inputWord){    
        for(word z:wordlist){               
            if(z.getWord() == inputWord)
                wordlist.remove(inputWord);
            System.out.println("the word" +inputWord+ "is removed");
        }
        System.out.println(wordlist.size());
    }

問題は、要素がリストから削除されていないことです。

4

4 に答える 4

5

を使用して、反復しているリストから要素を削除することはできませんenhanced for-loop。これは明らかに時々機能しますが、常に機能するとは限りませんConcurrentModificationException

反復中に要素を削除する場合は、現在の要素を削除するために使用できるIteratorメソッドを持つ を使用する必要があります。Iterator#remove

このチュートリアルを参照してください: - http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.htmlの使用方法を理解しますiterators

また、他の人がすでに述べたように、Object#equalsメソッドを使用して文字列の内容を比較する必要があります。使用==すると、内容を比較するのではなく、参照を比較します。

于 2012-10-27T08:26:12.080 に答える
1

z.getWord().equals(inputWord)文字列を比較するために使用し、Rohit の回答を読んでください!

于 2012-10-27T08:27:35.280 に答える
0

理由?

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

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

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

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

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

for (Iterator<word> 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("the word" + inputWord + "is removed");
        }
    }
    System.out.println(wordlist.size());

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

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

この場合、「break」ステートメントを追加する必要があります。

public void removeWord(String inputWord)
{
    for (Word z : wordlist) {
        if (z.getWord().equals(inputWord)) {
            wordlist.remove(z);
            System.out.println("the word" + inputWord + "is removed");
            break;
        }
    }
    System.out.println(wordlist.size());

}

list は単語オブジェクトに対して作成されるため、リストから単語 obj を削除する必要があります。if else ステートメントにも中括弧を使用してください。これはコードのベスト プラクティスです。

于 2012-10-27T08:46:49.740 に答える