gpt4 book ai didi

java - 将元素添加到另一个列表时出现 ConcurrentModificationException

转载 作者:行者123 更新时间:2023-12-01 09:46:41 26 4
gpt4 key购买 nike

突然,我一直在做的一个项目抛出了一个 ConcurrentModificationException当向列表添加元素时,并在尝试查看发生了很长一段时间之后,我像第一次发生此错误时一样困惑。

我有一个Tournament类,它由 Event 组成实例。 Activity 有一个时间段列表 List<Timeslot> timeslots (比赛进行时)。创建锦标赛实例时,锦标赛的时间段是所有赛事时间段的总和。不同 Activity 共享的时间段仅添加一次。

看看我如何实例化锦标赛(我省略了不相关的参数):

List<Localization> localizations = TournamentUtils.buildGenericLocalizations(1, "Court");
List<Timeslot> timeslots = TournamentUtils.buildSimpleTimeslots(8);
Event firstEvent = new Event(/*...*/, timeslots.subList(0, 2)););
Event secondEvent = new Event(/*...*/, timeslots);

Tournament tournament = new Tournament("Tournament", firstEvent, secondEvent);

这就是锦标赛构造函数的相关部分:

public Tournament(String name, List<Event> categories) {
// ...

allPlayers = new ArrayList<>();
allTimeslots = new ArrayList<>();
allLocalizations = new ArrayList<>();

events = new ArrayList<>(categories);

for (Event event : events) {
event.getPlayers().stream().filter(p -> !allPlayers.contains(p)).forEach(allPlayers::add);
event.getTimeslots().stream().filter(t -> !allTimeslots.contains(t)).forEach(allTimeslots::add);
event.getLocalizations().stream().filter(l -> !allLocalizations.contains(l)).forEach(allLocalizations::add);
event.setTournament(this);
}

// ...
}

public Tournament(String name, Event... categories) {
this(name, new ArrayList<>(Arrays.asList(categories)));
}

异常发生在 event.getTimeslots().stream().filter(t -> !allTimeslots.contains(t)).forEach(allTimeslots::add);线,我尝试用传统的 foreach 做同样的事情而不是使用流,但问题完全相同。

老实说,我不知道为什么会发生这种情况,因为我没有修改随时迭代的列表。

编辑。这是我尝试过的另一种方法,但我仍然遇到相同的异常。

for (Event event : events) {
for (Player player : event.getPlayers())
if (!allPlayers.contains(player))
allPlayers.add(player);

for (Localization localization : event.getLocalizations())
if (!allLocalizations.contains(localization))
allLocalizations.add(localization);

for (Timeslot timeslot : event.getTimeslots())
if (!allTimeslots.contains(timeslot))
allTimeslots.add(timeslot);

event.setTournament(this);
}

最佳答案

问题不在于迭代,而在于相同的列表被传递给不同的事件。

Event firstEvent = new Event(/*...*/, timeslots.subList(0, 2)););
Event secondEvent = new Event(/*...*/, timeslots);

这里firstEvent和secondEvent都包含相同的列表,因为Java子列表不会创建新列表,而是返回view of the original list

对于上面使用的列表时隙,相同的列表被传递不同的事件值,稍后用于迭代事件,以获取(尽管同一列表的不同 View )时隙。

由于 ListView 中的这种差异,会发生 ConcurrentModificationException

改用new Arraylist(timeslots.sublist(0,2))

关于java - 将元素添加到另一个列表时出现 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37944905/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com