прохождение элементов внутри самой внутренней петли

1

Я застрял в очень странной ситуации.. то есть есть два вложенных цикла и внутренний для цикла. Я проверяю какое-то условие, и если это условие становится истинным, тогда в этом состоянии я выхожу с внутренним циклом while при удалении элемент из списка aray в этом самом индексе, используя оператор continue, но теперь я хочу, чтобы тот самый самый внутренний для цикла продолжался для следующих оставшихся элементов массива, но обряда теперь этого не происходит... что на самом деле происходит обрядом теперь, если условие становится истинным во внутреннем цикле for, тогда элемент из этого индекса удаляется из araylist, а затем поток переходит к продолжению оператора, который снова отводит поток к началу внутреннего цикла, который является идеальным, но оттуда, теперь поток, идущий из внутреннего цикла, должен идти внутрь для цикла, который не происходит

согласно моему анализу, в то время как я удаляю элемент из списка в случае, когда условие становится истинным во внутреннем цикле, который создает проблему, пожалуйста, сообщите, так как продолжение снова возвращает поток к попрошайничеству внутреннего цикла, а затем оттуда вперед поток идет конец внутреннего цикла, который не должен происходить, он должен идти внутри цикла for для повторного использования элементов массива, пожалуйста, сообщите

//outermost for loop
for (File file : updatedFile) {

   //fetching data into the list 
   List<teetobjects> abcobjects = (List<teetobjects>) feedObjectsGetter.getObjects(file);

   //inner most for loop begains
   for (teetobjects pecdeedObject : abcobjects) {

      //checking some condition for each element in the inner most element ....
      if (st.contains(s1)) {

         // if the condition is true then removing the element of the 
         // aaraylist named abcobjects within inner for loop
         abcobjects.remove(recFeedObject);
         continue;
      }

   }
}
  • 4
    Извините, но я не понимаю вопроса. Постарайтесь объяснить более четко, что именно происходит и что вы ожидаете, вместо этого.
  • 0
    После продолжения нет кода, что вы хотите пропустить? Теперь, если есть код, это другое дело
Показать ещё 4 комментария
Теги:

3 ответа

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

Вы не можете удалять объекты из повторяющегося контейнера, используя "для каждой" версии цикла for: если вы удаляете объект из повторяющейся коллекции, вы получаете ConcurrentModificationException.

Для этого вам нужно ListIterator<T> использовать ListIterator<T>, а вызов remove на нем:

List<teetobjects> abcobjects = (List<teetobjects>)feedObjectsGetter.getObjects(file);
//inner most for loop begins
ListIterator<teetobjects> iter = abcobjects.listIterator();
while (iter.hasNext()) {
    teetobjects pecdeedObject = iter.next();
    //checking some condition for each element in the inner most element ....
    if (st.contains(s1)) {
         // if the condition is true then removing the element of the 
         // aaraylist named abcobjects within inner for loop
         iter.remove();
         continue;
    }
}
0

CopyOnWriteArrayList - это лучший класс вместо List, так как при изменении списка, поскольку чтение записи одновременно даст ConcurrentModicationException. Нет необходимости использовать continue, поскольку он будет перебирать оставшиеся элементы

0

Обновление по комментариям

Нет разницы, просто замените List на CopyOnWriteArrayList.

List<teetobjects> abcobjects = new CopyOnWriteArrayList<teetobjects>(); 

в вашем случае попробуйте

List<teetobjects> abcobjects = new CopyOnWriteArrayList<teetobjects>((List<teetobjects>) feedObjectsGetter.getObjects(file));

Полный код

//outermost for loop
for (File file : updatedFile) {

   //fetching data into the list 
   List<teetobjects> abcobjects = (List<teetobjects>) feedObjectsGetter.getObjects(file);

   /**
    * ArrayList are not threadsafe. Mutative operations like remove() method inside a for-each loop will result in ConcurrentModificationException.
    * One option is to use iterator as given in solution by dasblinkenlight. But iterators are more verbose and kind of outdated (just my opinion :) )
    * An alternative is CopyOnWriteArrayList. It is a thread-safe variant of ArrayList in which all mutative operations (add, set, and so on) 
    * are implemented by making a fresh copy of the underlying array. All these are underlying and the user may not be aware about this. 
    * So you could use it same like ArrayList. Just like  ConcurrentHashMap for HashMap.
    * 
    * So once you have the List<teetobjects> you can convert it to CopyOnWriteArrayList and the do mutative looping
    */
   List<teetobjects> concurrentAbcobjects = new CopyOnWriteArrayList<teetobjects>(abcobjects);

   //You could also initialize this as directly passing as a constructor argument from feedObjectsGetter as
   //List<teetobjects> abcobjects = new CopyOnWriteArrayList<teetobjects>((List<teetobjects>) feedObjectsGetter.getObjects(file));

   //inner most for loop begains
   // once you have the concurrent object ready you can loop using for-each as before.
   for (teetobjects pecdeedObject : concurrentAbcobjects) {

      //checking some condition for each element in the inner most element ....
      if (st.contains(s1)) {

         // if the condition is true then removing the element of the 
         // aaraylist named abcobjects within inner for loop
         abcobjects.remove(recFeedObject);
         continue;
      }

   }
  • 0
    Большое спасибо, но не могли бы вы опубликовать весь код, как я сделал, это помогло бы мне понять больше, пожалуйста, опубликуйте весь код, который преобразует мой код в способ, которым вы хотите объяснить заранее
  • 0
    Обновленный ответ. Пожалуйста, обратитесь к комментариям для получения дополнительной информации. :)

Ещё вопросы

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