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 aANYopenNodeclosed等于currNode's Point a

如果我必须匹配整个对象,我可以使用contains,但在这里我只关心状态类的一个变量(点 a)。我希望该方法检查 PriorityQueue 和 LinkedList 中的所有节点。

另外: 我正在考虑在我的priorityQueue 和LinkedList 上使用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;

当然,这只会找到一个这样的节点 - 可能有多个匹配项。

于 2012-09-23T07:15:28.340 回答
0

您必须Point astate类提供 equals 方法,或者只使用简单的迭代并迭代两个 List 进行比较。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;
    }
}

上面的比较方法返回 1 等于 else -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 回答