java - 如何在没有并发修改异常的情况下在for循环内将元素添加到java中的arraylist

标签 java collections iterator

我有一个 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);
        }
    }
}
}

但是执行它会抛出一个并发修改异常。我做了一些研究,发现可以使用 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

最佳答案

您可以像这样使用 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.hasNext() 之后多次调用 iterator.next()。每次调用 iterator.next() 时,它都会返回列表中的下一个元素,而不是同一个元素!

你应该像这样使用它:

LocationHourListHB locationHour = iterator.next()

然后在代码中使用 locationHour。

关于java - 如何在没有并发修改异常的情况下在for循环内将元素添加到java中的arraylist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53682882/

相关文章:

java - 按值的降序对 Map 进行排序

java - 允许多种预定义类型的集合

java - 如何在没有 Eclipse 的情况下使用 SWT?

java - 应如何组织提供 REST Web 服务的 JEE6 企业应用程序?

java - 在 WildFly 上重新部署后,CDI 无法在 @Requestscoped REST 服务中将 @Singleton 设置为 @Provider

c++ - 将迭代器的地址传递给 STL::for_each 中的函数

打印列表时 C++ 列表迭代器不兼容

java - 根据启动时的值在整个程序中使用某些对象

Java 集合过滤

c++ - 通过迭代器更改对象成员?