2016-04-10 98 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