2016-04-10 20 views
0

私は500ポイントのオブジェクトで満たされたArrayListを持っています。その中に重複があるかもしれないので、私はそれらを見つけ出したいと思います。プランは次のとおりです。arrayList内の各Pointをチェックし、等しい場合はListに追加し、各Pointのテストの後、toRemove-List内のすべてのPointを元の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++; 
    } 
} 

更新:

何かが本当に壊れています。メソッドは今のところうまくいくかもしれませんが、私のプログラムはisntです。このメソッドをどこかで呼び出すと、コードはもう実行されません。他のどこかで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

ポイントを削除した後で '' 'toRemove'''を空にする必要があるかもしれません。あなたがすでに削除した古いポイントはすべてそこに残っているはずです。また、あなたが削除したポイントに対して ''私は ''調整されないので、これはいくつかの点をスキップします。 –

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

その時点のオブジェクトがセットで検索できるようにポイントクラスに次のメソッドの独自の実装が含まれています

@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 )がメインです。removeDuplicates(); '私はこのようなメソッドを呼び出すとこれはいいですか?私は試しましたが、それは動作しないようですが、リストにも500の要素があります。いくつかの重複があるはずです – Master1114

+0

@ Master1114私はメソッド(戻り値** void **)を修正し、return文を削除しました。これは元のコードと同じです。 – ujulu

+0

私はこれの背後にあるアイデアを理解していますが、それは私にとってはうまくいきません。このメソッドを実行すると、リストにはまだ500個のオブジェクトが含まれています。また、別の問題があるようですが、同じリストを3回入れた場合、若干異なる結果になるので、 – Master1114

1

ポイント

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

期待通りdistinct()作業を行うには、おそらくのためequals()方法を定義する必要がありますあなたのPointクラス。

+0

私はこれまでこれについて聞いたhavent CSの勉強の最初の年にのみ。しかし、ティップのおかげで、私はそれを見ていきます。 – Master1114

関連する問題