2016-04-10 20 views
0

我有一个ArrayList充满了500个点对象。有可能是重复的,所以我想找到它们,如果需要删除它们,除了一个。该计划是:检查arrayList中的每个点,如果存在相同的点,如果是,则将其添加到列表中,在对每个点进行测试后,从原始列表中删除也位于toRemove-List中的所有点。意外的无限循环出现

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

另外,如果你有任何建议,如何更好地做到这一点,让我知道。

这是我的方法:

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

}

+0

点在哪里?哪个循环是无止境的? – Abdelhak

+1

也许你应该在清除点后清空'''清除'''''''''''''''''''''''''此外,这将跳过一些要点,因为''我''不会针对您删除的点进行调整。 –

+0

点是一个字段(ArrayList)。 – Master1114

回答

0

用户Frank Puffer已经在Java 8中回答了这个问题。看起来好像您使用的是旧版本的Java,因此以下内容可能对您有所帮助。它只是创建一个Set对象并将ArrayList复制到它。因为Set将自动删除重复项,所以不需要使代码比本应更复杂,并且不太容易出错。

private void removeDuplicates() { 
    Set<Point> distinctPoints = new HashSet<>(); 
    for (Point p : points) { 
     distinctPoints.add(p); 
    } 
    points = new ArrayList<String>(distinctPoints); 
} 

,并包括以下方法IMPL到类,以便Point对象可以被搜索的设置:

@Override 
public int hashCode() { 
    int hashValue = 11; 
    hashValue = 31 * hashValue + x; 
    hashValue = 31 * hashValue + y; 
    return hashValue; 
    } 

@Override 
public String toString() { 
    return "Point[" + X + ", " + Y + "]"; 
} 

的toString()方法是一个不错的功能。

+0

'main.points =(ArrayList )main。removeDuplicates();'如果我调用这样的方法,这会好吗?我已经尝试过了,但它似乎不起作用,列表中还有500个元素甚至应该有一些重复 – Master1114

+0

@ Master1114我修改了方法(返回类型** void **)并删除了返回语句。这相当于您的原始代码。 – ujulu

+0

我明白这背后的想法,但它不适合我。运行该方法后,该列表仍包含500个对象。另外,似乎还有另一个问题,因为当我把3次相同的名单,我得到略有不同的结果 – Master1114

1

我建议使用流完成这个任务:

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

为了使distinct()按预期方式工作,你可能要定义一个equals()方法你的Point类。

+0

我还没有听说过这个,因为我是只有在CS学习的第一年。但感谢tipp我会看看这个。 – Master1114