どのようにConcurrentModificationExceptionがなくてforループ内でJavaでArrayListに要素を追加します

ジオ・トーマス:

私は、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私はいくつかの研究を行って、それを使用して解決することができることを見出した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

HPCS:

あなたはこのように反復子を使用することができます。

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トーマス私は、あなたが編集に答えをしようとしていた参照してください。あなたが編集に送るコードの問題は)(あなたがiterator.hasNext後iterator.next()mutltiplle回を呼び出しているということです。あなたがiterator.nextを呼び出すたびに()は、リスト内の次の要素ではなく、同じものを返します!

あなたはこのようにそれを使用する必要があります。

LocationHourListHB locationHour = iterator.next()

その後、コードlocationHourに使用します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=209597&siteId=1