2012-06-26 2 views
1

У меня есть ArrayList, который иногда может содержать значения «Время (GMT)», «Нет» и «Нет датчика» на разных позициях. Я не хочу, чтобы удалить все экземпляры тех, так что я это мало написал цикл:Удаление элементов с определенными именами из ArrayList

for(int i = 0; i < trackedFieldsMod.size(); i++) { 
    if(trackedFieldsMod.get(i).equalsIgnoreCase("Time (GMT)") || trackedFieldsMod.get(i).equalsIgnoreCase("None") || trackedFieldsMod.get(i).equalsIgnoreCase("No Sensor")) { 
     trackedFieldsMod.remove(i); //Don't let users find average/mean/etc for irrelevant fields 
    } 
} 

По какой-то причине это будет удалить «Time (GMT)» в начале списка, и любой «None» или «Нет датчика» в конце списка, но если у моего ArrayList есть «None» или «No Sensor» посередине в любом месте, они не удаляются. Почему я не могу понять, почему. Есть предположения? Благодаря!

ответ

8

Когда вы удаляете элемент списка в позиции i, элемент, который раньше находился в i + 1, будет перемещен в i (все перемещается на 1 ячейку по направлению к i).

Однако, в вашей следующей итерации цикла i становится i + 1, поэтому в основном вы пропускаете этот элемент, который ранее перемещался с i + 1 на i при операции удаления. Вам нужно уменьшить i, когда вы удаляете элемент.

+0

Это применимо только в случае двух смежных вхождений. – matt5784

+0

Но, конечно. Мой друг, ты джентльмен и ученый. Я приму ваш ответ примерно через 7 минут. Haha – Nick

+2

Использование Iterator и [Iterator.remove()] (http://docs.oracle.com/javase/6/docs/api/java/util/Iterator.html#remove % 28% 29) по матчу, вероятно, проще всего. – sudocode

0

Просто используйте метод содержит строки .. он должен решить вашу проблему

4

Я обычно использую итератор, чтобы сделать это:

for (Iterator<String> iterator = trackedFieldsMod.iterator(); iterator.hasNext();) { 
    String string = iterator.next(); 
    if("Time (GMT)".equalsIgnoreCase(string) || "None".equalsIgnoreCase(string) || "No Sendor".equalsIgnoreCase(string)) { 
      iterator.remove(); //Don't let users find average/mean/etc for irrelevant fields 
    } 
} 
1

Для полноты картины я добавлю, что вы также могут использовать некоторые удобные методы для такого рода вещей:

List<String> toRemove = Arrays.asList("Time (GMT)", "None", "No Sendor"); 
trackedFieldsMod.removeAll(toRemove);