java - 出现意外的死循环

标签 java loops

我有一个充满 500 个点对象的 ArrayList。其中可能有重复项,因此我想找到它们,如果需要,请删除它们(除了一个)。计划是:检查arrayList中的每个Point,如果存在相等的Point,如果有,则将其添加到List中,对每个Point进行测试后,从原始List中删除也在toRemove-List中的所有Point .

但问题来了:如果我运行这个,它会陷入无限循环。我是否有严重的思维错误?我认为这可能是一个非常简单的错误,但我无法思考

此外,如果您对如何做得更好有任何建议,请告诉我。

这是我的方法:

private void checkForDuplicates() {

    ArrayList <Point> toRemove=new ArrayList<Point>();
    int i=0;    
    while(i<points.size()) {    
        Point local=points.get(i);

        for (Point p: points) {
            if (local!=p && local.equals(p)) {
                 toRemove.add(p);
            }
        }

        for (Point p: toRemove) {
            points.remove(p);
        }
        i++;
    }
}

更新:

有东西真的坏了。看起来这个方法现在可能有效,但我的程序不行。如果我在某处调用此方法,代码将不再运行。当我在其他地方调用 checkForDuplicates() 时,我什至无法在控制台上打印出一些内容作为主方法的第一行?!

要点:

public class Point {

private int x;
private int y;

public Point(int x, int y) {
    this.x = x;
    this.y = y;
}

public int getX() {
    return x;
}

public int getY() {
    return y;
}

@Override
public boolean equals(Object p) {
    if (this == p) {
        return true;
    }
    if (!(p instanceof Point)) {
        return false;
    }
    Point point = (Point) p;
    return this.getX() == point.getX() && this.getY() == point.getY();
}

}

最佳答案

我建议使用流来完成此任务:

List result =
    points
    .stream()
    .distinct()
    .collect(Collectors.toCollection(ArrayList::new));

为了使 distinct() 按预期工作,您可能必须为 Point 类定义一个 equals() 方法。

关于java - 出现意外的死循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36528363/

相关文章:

java - 将标签放在顶部 SWT 中

java - 如何在没有堆栈/正则表达式的情况下检查平衡括号?

java - Spring boot JPA,带有 @EmbeddedId 的实体 - findyById 方法不起作用

java - 无法将 UX Studio 与 java 7 一起使用 - 无需升级到 java 8

java - 如何删除 Java Swing 应用程序上的 native mac 标题栏

vba - Word VBA Selection.TypeText 和 Selection.InsertParagraph 以错误的顺序插入文本

python - 如何使用一个循环添加到多个组

javascript - 基本模数理解有问题

python - 在 python 中循环更新列表而不使用append 函数。

javascript - 取消 JavaScript 中的定时循环?