带有自定义匿名比较器的Java Priority Queue

时间:2010-03-31 18:03:27

标签: java priority-queue

请原谅我,如果这是一个经过深思熟虑的问题,但我有点难以搞清楚。

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

我在线查看了示例,但我能找到的只是字符串优先级队列。我可以为Node类实现Comparator吗?这会允许我访问存储在其中的数据成员吗?

非常感谢!

5 个答案:

答案 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()