Перебор списка списков - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь перебирать списки или списки, но все время получаю CME, даже используя Iterator для удаления и добавления элементов при переборах списков.

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

У меня есть ListIterator<List<Event<T>>> itrListsEvent = partitionSubLists.listIterator(); partitionSubLists - это A list of lists. Итак, у меня есть один больший список , и внутри него у меня есть четыре подсписка.

Мне нужно перебрать подсписки, и пока я перебираю, я удаляю и добавляю элементы. После окончания итерации по первому подсписку мне нужно go переслать, чтобы перебрать второй подсписок и т. Д. И т. Д.

Это то, что я сделал до сих пор:

  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>);
       }

}

1 Ответ

1 голос
/ 07 апреля 2020

Довольно непонятно, чего именно вы пытаетесь достичь. Насколько я понимаю, вы могли бы добиться этого следующим образом:

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<>());
}

Это позволяет избежать исключения ConcurrentModificationException, поскольку вы не изменяете структурно список после создания итератора.

Если вы не Если на самом деле требуется список «один элемент удален» между itrEvent.remove() и itrEvent.add(new Event<T>()), вы можете продолжать использовать ListIterator, а затем установить новое значение:

itrEvent.set(new Event<>());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...