Подтвердить что ты не робот

Можно ли получить индекс для каждого цикла в Java?

Учитывая приведенный ниже код, можно ли удалить индекс из p из списка свойств, используя этот стиль цикла for в Java?

List<Properties> propertiesList = new ArrayList<Properties>();
String keyToDelete = "blah";

for(Properties p : propertiesList) {
    if(p.getKey().equals(keyToDelete)) {
        propertiesList.remove(index) //How to remove the element at index 'p'
    }
}

Вот как это сделать с другим циклом for

List<Properties> propertiesList = new ArrayList<Properties>();
String keyToDelete = "blah";

for(int i = 0; i < propertiesList.size(); i++) {
        if(p.getKey().equals(keyToDelete)) {
                propertiesList.remove(i);
        }
}
4b9b3361

Ответ 1

Способ сделать это с явным Iterator (нет такой школы, как старая школа!).

Iterator<Properties> it = propertiesList.iterator();
while (it.hasNext()) {
    if (it.next().getKey().equals(keyToDelete)) {
        it.remove();
    }
}

В отличие от метода удаления в списке метод remove на итераторе не вызывает одновременной модификации. Это единственный безопасный способ удалить элемент из коллекции, которую вы повторяете. Поскольку javadoc для этого метода говорит:

Поведение итератора не определено, если базовая коллекция модифицирована, пока итерация выполняется каким-либо образом, кроме вызова этого метода.

Ответ 2

Нет, вам нужно использовать цикл старой школы для получения индекса.

Конечно, вы можете добавить его в цикл for-each, но тогда вам, скорее всего, будет лучше использовать старый вариант.

Ответ 3

Как насчет использования правильного Iterator и его метода remove?

List<Properties> propertiesList = new ArrayList<Properties>();
String keyToDelete = "blah";

for (
    Iterator<Properties> iter = propertiesList.iterator( );
    iter.hasNext( );
)
{
    Properties p = iter.next( );

    if(p.getKey().equals(keyToDelete)) {
        iter.remove( );
    }
}

Ответ 4

Как сказал Тим Андерсон, вы также можете изменить список вне цикла

List<Properties> propertiesList = new ArrayList<Properties>();
String keyToDelete = "blah";
List<Properties> propertiesToRemove = new ArrayList<Properties>();


for(Properties p : propertiesList) {
    if(p.getKey().equals(keyToDelete)) {
        propertiesToRemove.add(p) ;
    }
}

propertiesList.removeAll(propertiesToRemove);

Ответ 5

Насколько я знаю, цикл foreach не гарантирует порядок элементов, которые он перечисляет,

поэтому, если вы попробуете Collection [i], вы можете получить еще один элемент, а не итерированный

Это можно четко увидеть в некоторых многопоточных случаях