我最近正在使用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()
。我该怎么办呢?
非常感谢!
答案 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 question和this one或阅读wikipedia。