Можно ли получить индекс для каждого цикла в 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);
}
}
Ответы
Ответ 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], вы можете получить еще один элемент, а не итерированный
Это можно четко увидеть в некоторых многопоточных случаях