请原谅我,如果这是一个试用的问题,但我有点困难搞清楚。具有定制匿名比较器的Java优先级队列
我目前有一个类节点,每个'节点'是迷宫中的一个正方形。我试图实现A *算法,因此这些节点中的每个节点都会有一个f-cost(int)数据成员。我想知道是否有办法可以创建这些节点的优先级队列,并将f-cost变量设置为比较器?
我在网上看了一些例子,但我能找到的都是字符串优先级队列。我可以为节点类实现比较器吗?这会允许我访问存储在其中的数据成员吗?
非常感谢!
请原谅我,如果这是一个试用的问题,但我有点困难搞清楚。具有定制匿名比较器的Java优先级队列
我目前有一个类节点,每个'节点'是迷宫中的一个正方形。我试图实现A *算法,因此这些节点中的每个节点都会有一个f-cost(int)数据成员。我想知道是否有办法可以创建这些节点的优先级队列,并将f-cost变量设置为比较器?
我在网上看了一些例子,但我能找到的都是字符串优先级队列。我可以为节点类实现比较器吗?这会允许我访问存储在其中的数据成员吗?
非常感谢!
绝对如此。
您可以使用基于匿名Comparator
传递给构造一个PriorityQueue
:
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
你甚至都不需要定义一个新的Comparator
,作为订货会默认使用。除了任何其他方法,对象之间的自然顺序将被使用。
从Javadoc中:
根据 级堆的极大优先级队列。根据在构造时指定的顺序 ,其 是根据比较器
另外指定或者根据它们的 自然顺序(参见Comparable),或 此队列订单 元件,PriorityQueues支持通用的数据类型。因此,如果您在Node类中实现了Comparable
,那么您可以创建一个PriorityQueue<Node>
并正常使用它。
或者,还有一个构造函数PriorityQueue(int initialCapacity, Comparator<? super E> comparator)
,它将比较器作为PriorityQueue
构造函数的一部分。如果您更喜欢这种方法,那么在继承Comparable
时,您的节点类不需要包含额外的代码。
java.util中有一个PriorityQueue类。你可以使用它,它将使用自然排序(Node实现Comparable)或者在构造函数中提供的比较器(如果不需要Node类中的代码)。任何类都可以访问另一个数据,只要你允许它通过使字段非私有(可能是不好的OOP风格)或提供访问方法public int getG(),public int getH(),public int getF() 。
public class Node implements Comparable<Node>{
public int compareTo(Node o) {
// your comparative function
return 0;
}
}
如果的compareTo返回一个负的INT,它的意思是 “小于”,0表示 “等于”,1表示 “大于”
一个功能是所有你需要能够使用PriorityQueue。
编辑:比较是其他方式,我搞砸了。-1 < | 0 = | 1>我alreays由于某种原因阅读这些权利。
谢谢!看起来我只是在计算覆盖位时有点困难,你已经说清楚了! – Bharat 2010-03-31 18:22:51