在MinMaxPriorityQueue番石榴中更改比较器

时间:2015-07-07 19:45:49

标签: java guava priority-queue comparator

我最近正在使用MinMaxPriorityQueue。我的目标是从一些文本文件中获取顶级元素。该队列正在使用Ordering.natural(),但我想将其更改为Ordering.natural().reverse()。它不起作用,我不知道如何设置它。

Comparator<Long> comp = Ordering.natural().reverse();
MinMaxPriorityQueue<Long> pq = MinMaxPriorityQueue.maximumSize(11).create();
pq.orderedBy(comp);
System.out.println(pq.comparator());

无论如何,输出返回Ordering.natural()。我该怎么办呢? 非常感谢!

2 个答案:

答案 0 :(得分:3)

您必须在队列创建时传递Comparator,否则需要Ordering.natural()作为默认排序。根据javadocs

  

如果在施工时没有给出比较器,则使用元素的自然顺序。

因此,如果您需要反向排序,请通过传递Comparator

创建队列
Comparator<Long> comp = Ordering.natural().reverse();
MinMaxPriorityQueue<Long> pq = MinMaxPriorityQueue.orderedBy(comp).maximumSize(11).create();

答案 1 :(得分:2)

Guava的MinMaxPriorityQueue状态文档:

  

...队列的指定比较器。如果在施工时没有给出比较器,则使用元素的自然顺序。

应该是

Comparator<Long> comp = Ordering.natural().reverse();
MinMaxPriorityQueue<Long> pq = MinMaxPriorityQueue.orderedBy(comp)
        .maximumSize(11).create();

正如您所看到的,in the docs MinMaxPriorityQueue#orderedBy是一个静态方法,并返回Builder。你应该只通过类调用该方法,它应该告诉你方法不操作实例

Guava使用Builder模式:它不是提供改变实例行为的方法,而是提供在实例化之前设置该行为的可能性(通过Builder)。您可以在Builder上设置属性并调用Builder#create来获取实例。

有关详细信息,请参阅this questionthis one或阅读wikipedia