Java 的PriorityQueue将最小的元素放在列表的头部,但是我需要它将最大的元素放在头部。获得这样的优先级队列的最佳方法是什么。
由于我编写了存储在此队列中的类,因此我可以简单地反转 的结果compareTo
,它不在此队列之外使用。
但是,我喜欢使代码准确地表示我正在建模的内容,我想做的是首先获得最大的,所以代码应该这样说,而不是首先使用不寻常的最少定义。
[编辑]只是快速感谢大家,Comparator 听起来就像我自学如何编写一个时所需要的。
Java 的PriorityQueue将最小的元素放在列表的头部,但是我需要它将最大的元素放在头部。获得这样的优先级队列的最佳方法是什么。
由于我编写了存储在此队列中的类,因此我可以简单地反转 的结果compareTo
,它不在此队列之外使用。
但是,我喜欢使代码准确地表示我正在建模的内容,我想做的是首先获得最大的,所以代码应该这样说,而不是首先使用不寻常的最少定义。
[编辑]只是快速感谢大家,Comparator 听起来就像我自学如何编写一个时所需要的。
当您实例化PriorityQueue时,传递一个反转自然顺序的Comparator。
它看起来像这样:
public class ReverseYourObjComparator implements Comparator<YourObj> {
public int compare(final YourObj arg0, final YourObj arg1) {
return 0 - arg0.compareTo(arg1);
}
}
您的问题基本上有解决方案:您可以将Comparator传递给PriorityQueue的构造函数。比较器将影响物品的订购方式。
我只会使用比较器。这样排序顺序仅在您的队列中使用,而不是附加到您的班级。
只需通过构造函数提供PriorityQueue
自定义并更改元素的顺序。Comparator<? super E>
从javadocs:
PriorityQueue(int initialCapacity, Comparator<? super E> comparator)
要添加到比较器评论,请查看:
Collections.reverseOrder();
PriorityQueue 上的 api 文档说:“这个队列的头部是相对于指定排序的最小元素”。因此,最小的定义是基于您的特定顺序的主观定义,这就是您可以选择提供比较器的原因。