2015-04-07 177 views
2

我有停用词arraylist ..我想删除包含停用词的arraylist元素(字符串)。删除arraylist中的元素

这里的arraylist1,我想删除元素:

bicara 
dunia 
penerbangan 
orang 
sering 
salah 
menjawab 
bila 
ditanya 
siapa 
manusia 
pertama 
yang 
mengudara 
mayoritas 
menjawab 
oliver 
wilber 
wright 
dari 
amerika 
serikat 
yang 
terbang 
pada 
tahun 
padahal 

这里的禁用词:

dari 
bila 
ditanya 
menjawab 
pada 
padahal 
pertama 
siapa 
sering 
tahun 
yang 

这里是我的代码:

for (int i = 0; i < arraylist1.size(); i++) { 
    for (int j = 0; j < stopwords.size(); j++) { 
     if (stopwords.get(j).equals(arraylist1.get(i))) 
      arraylist1.remove(i); 
    } 
} 

但结果不符合我想要的:

bicara 
dunia 
penerbangan 
orang 
salah 
bila (not removed) 
manusia 
mengudara 
mayoritas 
oliver 
wilber 
wright 
amerika 
serikat 
terbang 
padahal (not removed) 
+0

阅读的区别[删除(int)](http://docs.oracle.com/javase/7/docs/api/java/util/List.html#remove(int))&[remove(java.lang.Object)](http: //docs.oracle.com/javase/7/docs/api/java/util/List.html#remove(java.lang.Object)) – StackFlowed

回答

3

问题是,你不看每个元素的列表,你看看列表中的每个索引。如果删除一个元素,那个元素后面的元素将向前移动,并改变它们的索引。如果停用词后跟另一个停用词,则第二个将被忽略。

如果你想解决您的解决方案,你可以这样做:

for (int i = 0; i < arraylist1.size(); i++) { 
    for (int j = 0; j < stopwords.size(); j++) { 
     if (stopwords.get(j).equals(arraylist1.get(i))) { 
      arraylist1.remove(i); 
      i--; // you have to look at the same index again! 
     } 
    } 
} 

然而,最好是使用由Java API提供的方法:

arraylist1.removeAll(stopwords); 
2

有一个更简单的方法来做到这一点(假设有在原来的列表中没有重复):

for (int j = 0; j < stopwords.size(); j++) { 
     arraylist1.remove(stopwords.get(j)); 
    } 

或更好(这会如果有重复甚至工作):

arraylist1.removeAll(stopwords);