gpt4 book ai didi

java - 需要帮助根据比较值修改列表(ConcurrentModification)

转载 作者:行者123 更新时间:2023-12-02 04:32:22 25 4
gpt4 key购买 nike

我试图通过点及其距离的排列来了解某些事物的可能性(不要告诉我没有,这是我失败的项目)。

for (Point p1 : results) {
remove.clear();
for (Point p2 : results) {
if (Math.sqrt(
Math.pow(p1.getX() - p2.getX(), 2)
+ Math.pow(p1.getY() - p2.getY(), 2)
) % 1 > 0) {
results.remove(p2);
}
}
}

基本上,我试图检查两个点是否具有整数距离,如果不是,则将其从集合中删除,并对所有点(剩余的)执行此操作。

但是,我收到了 ConcurrentModificationException,并且我不确定如何重构它以完成相同的任务,而不会以另一种方式引发错误。

有什么办法可以解决这个问题还是这只是 Java 的限制?

编辑:虽然重复的建议链接提供了见解,但答案对单个循环的关注有过多的不适用的地方。如果这个问题是重复的,那么前提是使用迭代器就是答案。

最佳答案

一些Collection实现使用“快速失败”迭代器。当直接从 Collection 中删除项目(使用 Collection#remove)并对其进行迭代时,将会导致该异常。

增强的 for 循环使用集合的迭代器来迭代集合。

您可以将增强循环更改为常规 for 循环:

for(int i = 0; i < results.size(); i++) {
for(int j = 0; j < results.size(); j++) {
Point result = results.get(j);
if(...) {
//results.remove(j); or
//results.remove(result);
}
}
}

正如评论中提到的,这不适用于Set。在这种情况下,您可以简单地保留对集合迭代器的引用,并使用它来删除项目:

Iterator<Point> firstIter = results.iterator();
while(firstIter.hasNext()) {
Point p1 = iterator.next();

Iterator<Point> secondIter = results.iterator();
while(secondIter.hasNext()) {
Point p2 = secondIter.next();

if(...) {
secondIter.remove();
}
}
}

关于java - 需要帮助根据比较值修改列表(ConcurrentModification),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31275182/

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