2015-04-07 3 views
2

У меня есть секундомер arraylist .. Я хочу удалить элемент arraylist (String), содержащий временные слова.Удалить элемент в 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);