Как добавить элементы в массив в Java внутри цикла for без одновременного исключения исключения - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть веб-приложение Java Spring MVC.Я пытаюсь перебрать ArrayList и добавить новые элементы в список на основе определенных условий.Я использую следующий код:

List<LocationHourListHB> locationHoursList = new ArrayList<LocationHourListHB>();
List<HoursTO> hourList = listHoursByEntityId(applicationId, siteId, locationId);
for (HoursTO hoursTO : hourList) 
{
    if(locationHoursList.size() == 0)
    {
        LocationHourListHB locationHourListHB = new LocationHourListHB();
        locationHourListHB.setStartTIme(hoursTO.getStartTime());
        locationHourListHB.setEndTime(hoursTO.getEndTime());
        locationHoursList.add(locationHourListHB);
        break;
    }
    for (LocationHourListHB locationHour : locationHoursList) 
    {
        if(hoursTO.getStartTime().equalsIgnoreCase(locationHour.getStartTIme()) && hoursTO.getEndTime().equalsIgnoreCase(locationHour.getEndTime()))
        {
            break;
        }
        else
        {
            LocationHourListHB locationHourListHB = new LocationHourListHB();
            locationHourListHB.setStartTIme(hoursTO.getStartTime());
            locationHourListHB.setEndTime(hoursTO.getEndTime());
            locationHoursList.add(locationHourListHB);
        }
    }
}
}

Но выполнение этого броска concurrent modification exception.Я провел некоторое исследование и обнаружил, что его можно решить с помощью iterator или list iterator.Есть ли хороший пример для использования моей проблемы с list iterator.Или есть лучшее решение, которое могло бы спасти меня.

Я пробовал следующий код:

for (HoursTO hoursTO : hourList) 
{
    if(locationHoursList.size() == 0)
    {
        LocationHourListHB locationHourListHB = new LocationHourListHB();
        locationHourListHB.setStartTIme(hoursTO.getStartTime());
        locationHourListHB.setEndTime(hoursTO.getEndTime());
        locationHoursList.add(locationHourListHB);
        }
        ListIterator<LocationHourListHB> iter = locationHoursList.listIterator();
        while(iter.hasNext())
        {
        if(!(iter.next().getStartTIme().equalsIgnoreCase(hoursTO.getStartTime()) && iter.next().getEndTime().equalsIgnoreCase(hoursTO.getEndTime())))
        {
            LocationHourListHB locationHourListHB = new LocationHourListHB();
            locationHourListHB.setStartTIme(hoursTO.getStartTime());
            locationHourListHB.setEndTime(hoursTO.getEndTime());
            iter.add(locationHourListHB);
        }
    }
}

Но получаю NoSuchElementException

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

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

В ListIterator есть метод add, который добавляетновый элемент перед следующим.

    List<String> list = new ArrayList<>();
    list.add("one");
    list.add("two");
    ListIterator<String> iterator = list.listIterator();
    while (iterator.hasNext()) {
        String value = iterator.next();
        if (value.equals("one")) {
            iterator.add("three");
        }
    }
    System.out.println(list);  // prints [one, three, two]

Если вам нужно добавить в конец списка, используйте второй список и добавьте их после цикла

    List<String> list = new ArrayList<>();
    List<String> newValues = new ArrayList<>();
    list.add("one");
    list.add("two");
    for (String value : list) {
        if (value.equals("one")) {
            newValues.add("three");
        }
    }
    list.addAll(newValues);
    System.out.println(list);  // prints [one, two, three]
0 голосов
/ 08 декабря 2018

Вы можете использовать ListIterator следующим образом:

ArrayList<LocationHourListHB> locationHoursList = new ArrayList<LocationHourListHB>();

ListIterator<LocationHourListHB> iterator = locationHoursList.listIterator();

while(iterator.hasNext(){
LocationHourListHB locationHour = iterator.next()
  if(hoursTO.getStartTime().equalsIgnoreCase(locationHour.getStartTIme()) && hoursTO.getEndTime().equalsIgnoreCase(locationHour.getEndTime()))
        {
            break;
        }
        else
        {
            LocationHourListHB locationHourListHB = new LocationHourListHB();
            locationHourListHB.setStartTIme(hoursTO.getStartTime());
            locationHourListHB.setEndTime(hoursTO.getEndTime());
            iterator.add(locationHourListHB);
        }

}

@ Geo Thomas Я вижу, что вы пытались редактировать ответ, для этого лучше написать в комментариях или обновить свой вопрос.Проблема с кодом, который вы отправляете в редактирование, состоит в том, что вы вызываете iterator.next () mutltiplle раз после iterator.hasNext ().Каждый раз, когда вы вызываете iterator.next (), он возвращает следующий элемент в списке, а не тот же самый!

, вы должны использовать его следующим образом:

LocationHourListHB locationHour = iterator.next()

И затем использовать вкод местоположения час.

...