私は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();
}
}
ポイントはどこですか?どのループが無限ですか? – Abdelhak
ポイントを削除した後で '' 'toRemove'''を空にする必要があるかもしれません。あなたがすでに削除した古いポイントはすべてそこに残っているはずです。また、あなたが削除したポイントに対して ''私は ''調整されないので、これはいくつかの点をスキップします。 –
ポイントはフィールド(ArrayList)です。 – Master1114