2010-03-31 98 views
5

请原谅我,如果这是一个试用的问题,但我有点困难搞清楚。具有定制匿名比较器的Java优先级队列

我目前有一个类节点,每个'节点'是迷宫中的一个正方形。我试图实现A *算法,因此这些节点中的每个节点都会有一个f-cost(int)数据成员。我想知道是否有办法可以创建这些节点的优先级队列,并将f-cost变量设置为比较器?

我在网上看了一些例子,但我能找到的都是字符串优先级队列。我可以为节点类实现比较器吗?这会允许我访问存储在其中的数据成员吗?

非常感谢!

回答

8

绝对如此。

您可以使用基于匿名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,作为订货会默认使用。除了任何其他方法,对象之间的自然顺序将被使用。

+0

谢谢!看起来我只是在计算覆盖位时有点困难,你已经说清楚了! – Bharat 2010-03-31 18:22:51

1

从Javadoc中:

根据 级堆的极大优先级队列。根据在构造时指定的顺序 ,其 是根据比较器

另外指定或者根据它们的 自然顺序(参见Comparable),或 此队列订单 元件,PriorityQueues支持通用的数据类型。因此,如果您在Node类中实现了Comparable,那么您可以创建一个PriorityQueue<Node>并正常使用它。

或者,还有一个构造函数PriorityQueue(int initialCapacity, Comparator<? super E> comparator),它将比较器作为PriorityQueue构造函数的一部分。如果您更喜欢这种方法,那么在继承Comparable时,您的节点类不需要包含额外的代码。

0

java.util中有一个PriorityQueue类。你可以使用它,它将使用自然排序(Node实现Comparable)或者在构造函数中提供的比较器(如果不需要Node类中的代码)。任何类都可以访问另一个数据,只要你允许它通过使字段非私有(可能是不好的OOP风格)或提供访问方法public int getG(),public int getH(),public int getF() 。

1
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由于某种原因阅读这些权利。

+0

谢谢!除了比较位以外,我的工作进展非常顺利,而+ ve,-ve也说得很清楚。 爱侵略者Zim avatar btw ^^ – Bharat 2010-03-31 18:25:27

+1

要小心,比较结果是“倒退”:排名较低的值先返回。如果你认为优先级队列是一个按升序排序的列表是有意义的,但是当我第一次使用一个列表时,它让我感到困惑,因为我预期优先级为100的元素显然“高于”一个优先级30 ...;) – TMN 2010-03-31 18:43:33