的元素,我知道有几十个类似这样的问题,但我无法找到一个答案,我的具体问题。对不起,如果我错过了 - 请告诉我在哪里看,如果它存在!排序列表中有相同的值,但不同的身份
这个问题似乎很常见的对我说:我需要通过对象的某些属性排序对象的列表,只有列表中有每个对象一次。具体来说,我正在实现A *路径查找,并需要按节点的F值排序的打开列表。
我试图用一个TreeSet与比较两个节点的F值,这样的比较:
public class NodeFComparator implements Comparator<Node> {
@Override
public int compare(Node arg0, Node arg1) {
return (arg0.getF() - arg1.getF());
}
}
类节点是这样看:
public class Node {
PathableMap parentmap;
Point coord; // coordinates on the map
private Node parent; // parent node: used by astar to backtrace shortest path
(etc etc)
/*
* F-value of a node is the sum of the distance from start + distance to target.
* The nodes are searched in the order of that value.
*/
public int getF() {
return getG() + getH();
}
@Override
public int hashCode() {
final int prime = 65537;
return prime * coord.x + coord.y;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Node other = (Node) obj;
if (coord == null) {
if (other.coord != null)
return false;
} else if (!coord.equals(other.coord))
return false;
return true;
}
}
问题这个解决方案似乎是,如果两个不同的节点具有相同的f值(这一直发生),换句话说比较器返回0,TreeSet似乎将它视为Node1 == Node2,并且不会将第二个节点到列表或做一些其他奇怪的事情,因为我的openli st错过了应该在那里的节点。
所以,我能想到的与现有类这样做的唯一方法是使用一个简单的ArrayList和每个I节点追加到它的时间排序。
是否真的在Java或Apache的百科全书没有集合类:
- 通过对象的任何属性保留对象的排序列表
- 已经快速查找并插入次
- 一样简单用作其他集合类?
我不解。
什么类节点是?如果它是你的习惯,你是否正确实现了equals/hashCode合约? –
节点非常复杂,我在问题中添加了一个简短的版本。 – jackthehipster
如果添加第二个比较,如果getF()等于另一个getF(),那么它应该可以解决您的问题。在那里你可以使用.toString()并将其与其他的进行比较.toString() – Tomas