包含功能链表

时间:2012-09-23 07:11:44

标签: java linked-list override priority-queue

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 aopenNode的{​​{1}}是否等于closed currNode

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

此外: 我正在考虑在priorityQueue和LinkedList上使用Iterator。但我不知道如何使用Iterator读取Point a的值。

3 个答案:

答案 0 :(得分: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 :(得分:0)

您必须在Point a上为state类提供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所以当你进行排序时,每个列表在开始时都会有相同的元素。然后你可以检查第一个元素。

答案 2 :(得分: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;
    }
    }