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 a
或openNode
的{{1}}是否等于closed
currNode
。
如果我必须匹配整个对象,我可以使用Point a
但是在这里我只关心状态类的一个变量(Point a)。我希望该方法检查PriorityQueue和LinkedList中的所有节点。
此外: 我正在考虑在priorityQueue和LinkedList上使用Iterator。但我不知道如何使用Iterator读取Point a的值。
答案 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;
}
}