请原谅我,如果这是一个经过深思熟虑的问题,但我有点难以搞清楚。
我目前有一个类Node,每个'node'都是迷宫中的一个正方形。我正在尝试实现A *算法,因此每个节点都有一个f-cost(int)数据成员。我想知道是否有办法可以创建这些节点的优先级队列,并将f-cost变量设置为比较器?
我在线查看了示例,但我能找到的只是字符串优先级队列。我可以为Node类实现Comparator吗?这会允许我访问存储在其中的数据成员吗?
非常感谢!
答案 0 :(得分:14)
绝对
您可以使用基于传递给构造函数的匿名PriorityQueue
的{{1}}:
Comparator
如果您的int initCapacity = 10;
PriorityQueue<Node> pq = new PriorityQueue<Node>(initCapacity, new Comparator<Node>() {
public int compare(Node n1, Node n2) {
// compare n1 and n2
}
});
// use pq as you would use any PriorityQueue
类已经实现Node
,您甚至不需要定义新的Comparable
,因为默认情况下会使用该订单。除非采用任何其他方法,否则将使用对象之间的自然顺序。
答案 1 :(得分:2)
这个问题已经回答了一段时间,我想提供一些新的可用选项。
1)如果您的Node
类没有实现Comparator接口并且您不想(或不能)添加它,请使用lambda:
new PriorityQueue<>((node1, node2) -> Integer.compare(node1.getCost(), node2.getCost()));
2)简单的逆序方法(需要Node来实现Comparator接口):
new PriorityQueue<>(Comparator.reverseOrder());
3)使用实用程序功能
new PriorityQueue<>(NodeUtil::customCompare);
public static int customCompare(Node n1, Node n2) {
return Integer.compare(n1.getCost(), n2.getCost());
}
答案 2 :(得分:1)
来自Javadocs:
基于a的无界优先级队列 优先级堆。这个队列命令 根据订单的元素 在施工时指定的, 是根据他们的指定 自然顺序(见可比较),或 根据比较者的说法
此外,PriorityQueues支持通用数据类型。因此,如果在Node类中实现Comparable
,则可以创建PriorityQueue<Node>
并正常使用它。
或者,有一个构造函数PriorityQueue(int initialCapacity, Comparator<? super E> comparator)
,它将Comparator作为PriorityQueue
构造函数的一部分。如果您更喜欢这种方法,那么继承Comparable
时,您的节点类不需要包含所需的额外代码。
答案 3 :(得分:1)
public class Node implements Comparable<Node>{
public int compareTo(Node o) {
// your comparative function
return 0;
}
}
如果compareTo返回负int,则表示“小于”,0表示“等于”,1表示“大于”
您只需要一个功能就可以使用PriorityQueue。
编辑:比较是另一种方式,我搞砸了。 -1&lt; | 0 = | 1>我因为某种原因阅读了从右到左的内容。答案 4 :(得分:0)
java.util中有一个PriorityQueue类。您可以使用它,它将使用自然排序(Node实现Comparable)或构造函数中提供的比较器(如果您不希望Node类中包含该代码)。任何类都可以访问另一个类中的任何数据,只要你允许它通过使字段非私有(可能是错误的OOP样式)或提供访问器方法public int getG(),public int getH(),public int getF()