3
public class state implements Comparator<state>{
        Point a;
        Point b;
        private int path_cost=0;
        ...
}

    class Point {
        int x;
        int y;
        ...
    }

上記のために私は持っています:

PriorityQueue<state> openNode= new PriorityQueue<state>();
LinkedList<state> closed =new LinkedList<state>();
state currNode;

Point aANYopenNodeまたはclosedequalsかどうかを確認する必要がありcurrNodeますPoint a

オブジェクト全体を一致させる必要がある場合に使用できcontainsますが、ここでは、状態クラスの 1 つの変数 (ポイント a) だけを気にします。PriorityQueue と LinkedList のすべてのノードをチェックするメソッドが必要です。

追加: 私は優先キューと LinkedList で Iterator を使用することを考えています。しかし、Iterator を使用して Point a の値を読み取る方法がわかりません。

4

3 に答える 3

2

編集:少し誤解しているように見えました。思ったより簡単です。

// I've assumed more conventional names
Point currPoint = currNode.getPointA();
for (State openNode : openNodes) {
    if (openNode.getPointA().equals(currPoint)) {
        return true;
    }
}

for (State closedNode : closedNodes) {
    if (closedNode.getPointA().equals(currPoint)) {
        return true;
    }
}
// No matching points
return false;

Guava のIterables.concat()方法を使用して、これを少し簡単にすることができます。

for (State node : Iterables.concat(closedNodes, openNodes)) {
    if (node.getPointA().equals(currPoint)) {
        return true;
    }
}
return false;

点 A が等しいノードを知る必要がある場合は、次のように変更します。

for (State node : Iterables.concat(closedNodes, openNodes)) {
    if (node.getPointA().equals(currPoint)) {
        return node;
    }
}
return null;

もちろん、そのようなノードは1 つしか見つかりません。複数の一致が存在する可能性があります。

于 2012-09-23T07:15:28.340 に答える
0

クラスにequalsメソッドを提供するか、Point a単純stateな反復を使用して両方のリストを反復して比較する必要があります。containsメソッドは同じことをします。

他の方法を使用する場合は、時間がかかります。

非常に奇妙な方法が使用されていますComparator to check equality

 class PointAComparator implements Comparator<State>

{
    Point p = null;
    public PointAComparator(Point a) {
        p = a;
    }
    @Override
    public int compare(State o1, State o2) {
        return (p.x == o1.a.x && p.y == o1.a.y) ? 1
                : (p.x == o2.a.x && p.y == o2.a.y) ? 1 : -1;
    }
}

上記のcompareメソッドは、等しい場合は1を返し、それ以外の場合は-1を返します。したがって、並べ替えを行うと、各リストの先頭に等しい要素が含まれます。次に、最初の要素を確認できます。

于 2012-09-23T09:00:13.447 に答える
0

equals私は両方のオブジェクトの 関数をオーバーライドするメソッドを使用し、結果を達成しました。

       class Point {
            int x;
            int y;
            ...

    @Override
    public boolean equals(Object other){
        if (other == null) return false;
        if (other == this) return true;
        if (!(other instanceof Point))return false;
        Point otherPoint = (Point)other;
        return (this.x==otherPoint.getX() && this.y==otherPoint.getY() )? true : false;
    }

        }



public class state implements Comparator<state>{
            Point a;
            Point b;
            private int path_cost=0;
            ...
    @Override
    public boolean equals(Object other){
        if (other == null) return false;
        if (other == this) return true;
        if (!(other instanceof state))return false;
        state otherState = (state)other;
        return ((this.a).equals(otherState.a))? true : false;
    }
    }
于 2012-09-30T22:43:14.587 に答える