【问题标题】:How to add elements to an arraylist in java inside a for loop without concurrentmodificationexception如何在没有并发修改异常的情况下在for循环内将元素添加到java中的arraylist
【发布时间】:2018-12-08 13:13:33
【问题描述】:

我有一个 Java Spring MVC Web 应用程序。我正在尝试遍历 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。我做了一些研究,发现可以使用iteratorlist 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

【问题讨论】:

  • 不要多次使用 iter.next() ,看我更新的答案。

标签: java collections iterator


【解决方案1】:

你可以像这样使用 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 我看到您正在尝试编辑答案,因为这最好写入 cmets 或更新您自己的问题。您发送到编辑的代码的问题是您在 iterator.hasNext() 之后多次调用 iterator.next()。每次调用 iterator.next() 时,它都会返回列表中的下一个元素,而不是同一个!

你应该这样使用它:

LocationHourListHB locationHour = iterator.next()

然后在代码中使用locationHour。

【讨论】:

  • 那个编辑是错误的。感谢更新
【解决方案2】:

你不能使用迭代器,如果你在迭代时尝试添加到列表中,你会得到同样的异常,并且迭代器上没有 add 方法。

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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 2014-05-26
    • 2022-01-12
    • 2020-03-02
    • 1970-01-01
    相关资源
    最近更新 更多