У меня есть ArrayList, который иногда может содержать значения "Время (GMT)", "Нет" и "Нет датчика" на разных позициях. Я хочу удалить все экземпляры из них, поэтому я написал этот маленький цикл:
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
}
}
По какой-то причине это приведет к удалению "Времени (GMT)" в начале списка и любых "Нет" или "Нет датчика" в конце списка, но если у моего ArrayList есть "Нет" или "Нет датчика" "посередине в любом месте они не удаляются. Почему я не могу понять, почему. Есть предположения? Благодарю!
Когда вы удаляете элемент списка в позиции i, элемент, который раньше находился в я + 1, будет перемещен в я (все перемещает 1 ячейку в сторону i).
Однако в вашей следующей итерации цикла я становится я + 1, поэтому в основном вы пропускаете этот элемент, который ранее перемещался с я + 1 на я при операции удаления. Вам нужно уменьшить i, когда вы удаляете элемент.
Обычно я использовал итератор для этого:
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
}
}
Ради полноты я добавлю, что вы также можете использовать некоторые удобные методы для такого рода вещей:
List<String> toRemove = Arrays.asList("Time (GMT)", "None", "No Sendor");
trackedFieldsMod.removeAll( toRemove );
Просто используйте метод string. Он должен решить вашу проблему