有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java意外循环出现

我有一个数组列表,里面有500个点对象。可能有重复的,所以我想找到他们,如果需要删除他们,除了一个。计划是:检查arrayList中的每个点,如果有相等的点,如果有,将其添加到列表中,在测试每个点后,从原始列表中删除toRemove列表中的所有点

但问题来了:如果我运行这个,它将进入一个无休止的循环。我有严重的思维错误吗?我想这可能是一个很简单的失误,但我想不起来

另外,如果你对如何做得更好有任何建议,请告诉我

这是我的方法:

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();
}

}


共 (1) 个答案

  1. # 1 楼答案

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

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

    要使distinct()按预期工作,您可能需要为Point类定义一个equals()方法