gpt4 book ai didi

java - 从 ArrayList 中删除随机项导致 ConcurrentModificationException

转载 作者:行者123 更新时间:2023-12-01 11:22:17 24 4
gpt4 key购买 nike

所以,我的代码遇到了一些障碍,我不知道为什么,或者如何解决它。我正在编写一个方法,它将获取对象列表并根据一些规则对其进行过滤。应用所有规则后,如果列表仍然超过一定大小,我需要从特定子列表中随机选择项目,然后丢弃其余的。我遇到的问题来自这段代码:

List<Group> filteredList = groupList.subList(0, firstMatch);

if(filteredList.size() < MAX_NUM_RETURNED){
//This sub list is where I need to pull random items from
List<Group> subList = new ArrayList<Group>();
subList = groupList.subList(firstMatch, lastMatch);

Random rand = new Random();

while(filteredList.size() < MAX_NUM_RETURNED){
int randPos = rand.nextInt(subList .size());
//remove a random group from the sublist and add it to the filtered list
filteredList.add(subList.remove(randPos));
}
}

filteredList 从 0 - n 个组开始,如果其大小小于子集中的最大随机组,则会添加子集中的随机组,直到达到该数量。

问题是,当调用 filteredList.add(subList.remove(randPos)); 行时,我收到 ConcurrentModificationException 错误,并且程序停止。

我已经查找了导致此错误的原因,但我看到的所有示例似乎并不适用于这种情况。我不会迭代任何一个列表,我只是根据其中一个列表的大小运行循环。我所看到的大多数修复 ConcurrentModificationException 的建议都是创建一个迭代器并使用 remove() ,但这只会删除迭代器中的下一个项目,而我每次都需要删除一个随机项目。

我的问题是,我是否需要做出一些明显的改变来避免并发问题,或者整个方法是否存在根本缺陷?

附注可能存在一些低效的代码或一些尚未处理的边缘情况。我正在进行 TDD,但尚未完成所有测试用例。当前的测试是当 filteredList 的大小为 0,并且 subList 包含原始 groupList 中的每个组时。 一旦这个测试停止破坏我将重构并处理其他测试用例。

最佳答案

当您修改 subList 时,您也在修改 groupList。因此,如果您在此过程中迭代 groupList,您将得到 ConcurrentModificationExceptions。

听起来您不需要修改groupList(因为您需要的是filteredList)。因此,尝试将 subList 设为自己的列表,而不是 groupList 上的 View :

List<Group> subList = new ArrayList<>(groupList.subList(firstMatch, lastMatch));

关于java - 从 ArrayList 中删除随机项导致 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31081142/

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