我有一个充满 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/