0

2つの配列リストfileWordListとstopWordListがあります。fileWordListをstopWordListと比較し、fileWordListから同じ単語を削除したいと思います。私のコードは以下の通りです:

ArrayList<String> fileWordList = new ArrayList<String>();
ArrayList<String> stopWordList = new ArrayList<String>();

for (Iterator<String> i = fileWordList.iterator(); i.hasNext(); ) {

    for(Iterator<String> j = stopWordList.iterator(); j.hasNext();){
        if (j.next() == i.next()){
           i.remove();
        }
    }

}

エラーの原因は、java.util.NoSuchElementExceptionです。これを解決する方法は?コードの何が問題になっていますか?

4

3 に答える 3

4

何度も電話をかけi.next()ています。外側のループの反復ごとに1回呼び出して、結果を覚えておく必要があります。

for (Iterator<String> i = fileWordList.iterator(); i.hasNext(); ) {
    String s = i.next();
    for(Iterator<String> j = stopWordList.iterator(); j.hasNext();){
        if (j.next() == s){ // consider using equals here
           i.remove();
           break; // No need to continue checking.
        }
    }

}

j.next().equals(s)2つの文字列が等しいかどうかを比較するために使用したいと思います。

の使用を検討することもできますArrayList.contains。またはHashSet、ストップワードを保存するためにを使用します。おそらく、ストップワードが保存される順序は気にしないからです。

于 2012-07-29T15:56:51.350 に答える
1

contains()ネストされたループの代わりにArrayList メソッドを使用しないのはなぜですか?

for (Iterator<String> i = fileWordList.iterator(); i.hasNext(); ) {

    String word = i.next();

    // Only removes first occurence.
    if (stopWordList.contains(word)) {
        i.remove();
    }
}

// Better and simpler solution
for (String word : stopWordList) {
    while(fileWordList.contains(word)) {
        fileWordList.remove(word);
    }
}
于 2012-07-29T16:15:30.420 に答える
0
for(String word : stopWordList) 
    if(fileWordList.contains(word)) 
        fileWordList.remove(word)
于 2012-07-29T16:19:10.790 に答える