Удаление элементов с конкретными именами из ArrayList

1

У меня есть 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 есть "Нет" или "Нет датчика" "посередине в любом месте они не удаляются. Почему я не могу понять, почему. Есть предположения? Благодарю!

Теги:
arraylist

4 ответа

8
Лучший ответ

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

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

  • 0
    Это применимо, только если есть два смежных случая.
  • 0
    Но конечно. Мой друг, вы джентльмен и ученый. Я приму ваш ответ через 7 минут, ха-ха
Показать ещё 2 комментария
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 );
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню