Guilherme Schults
Guilherme Schults

Reputation: 53

Iterating over List of Lists

I'm trying to iterate over a list os lists but I'm getting CME all the time even using Iterator to remove and add elements while iterating over the lists.

I searched here in the community for similar questions but those I found didn't help me. Really hope you guys help me to figure out how to do what I need to do.

I have I ListIterator<List<Event<T>>> itrListsEvent = partitionSubLists.listIterator(); partitionSubLists is A list of lists. So I have one bigger List and inside it I have four sublists.

I need to iterate over the sublists, and while iterating I remove and add elements. After finishing to iterate over the first sublist, I need to go forward to iterate over the second sublist and so on and so forth.

This is what I've done so far:

  public List<List<Event<T>>> partitionedLists (List<Event<T>> list)
    {     
        int listSize = list.size();
        int partitionSize = listSize / 4;

        List<List<Event<T>>> partitions = new ArrayList<>();

        for (int i = 0; i < listSize; i += partitionSize) 
        {
            partitions.add(list.subList(i, Math.min(i + partitionSize, list.size())));
        }        
        return partitions;        
    }

List<List<Event<T>>> partitionSubLists     = partitionedLists(List<Event<T>>);
ListIterator<List<Event<T>>> itrListsEvent = partitionSubLists.listIterator();

while(itrListsEvent.hasNext())
{
       List<PrefixEvent<T>> listPE  = new ArrayList<Event<T>>();            
       listPE   = itrListsPrefixEvent.next(); 
       ListIterator<Event<T>> itrEvent = listPE.listIterator();

       while(itrEvent.hasNext())
       {
          //here I remove and add elements inside the sublist.
          //when finished, I need to go back to first while and go forward to the next sublists
          //and in this moment, i got ConcurrentModificationException

         itrEvent.remove()
            .
            . 
            .
        // some code here

         itrEvent.add(new Event<T>);
       }

}

Upvotes: 1

Views: 540

Answers (1)

Andy Turner
Andy Turner

Reputation: 140544

It's rather unclear exactly what you're trying to achieve. As far as I understand, you could achieve it like this:

List<PrefixEvent<T>>  listPE   = itrListsPrefixEvent.next();
// No iterator.

for (int i = 0; i < listPE.size(); ++i) {
  listPE.remove(i);

  // some code here

  listPE.add(i, new Event<>());
}

This avoids a ConcurrentModificationException because you don't structurally modify the list after creating an Iterator.

If you don't actually require the "one element removed" list in between the itrEvent.remove() and itrEvent.add(new Event<T>()), you can continue to use the ListIterator, and then set the value to a new value:

itrEvent.set(new Event<>());

Upvotes: 1

Related Questions