在一个方法中,我接收一个泛型object E extends Comparable<E>
作为参数。现在我想创建两个优先级队列。一个队列使用E使用的comparator
,另一个队列则使用与E使用的comparator
相反的队列(即,如果E使用'<',则第二个队列必须使用'>=')。请教我如何创建两个这样的队列。
queue2=new PriorityQueue<E>(0,Collections.reverseOrder(e));
我得到的错误是reverseOrder
不适用。
请帮助
查看Collections.reviseOrder.
对象E
扩展了java.lang.Comparable,
,但它不是java.util.Comparator
。
创建第一个没有比较器的队列,您将在compareTo
函数中获得排序,然后创建一个反向进行比较的java.util.Comparator
(只需调用.compareTo(b),然后对结果求反),并使用该比较器创建第二个队列。
queue2=new PriorityQueue<E>(1, Collections.reverseOrder());
下面的程序描述了如何做到这一点。
我有StringLengthComparator
,它根据字符串长度进行比较。使用Collections.reverseOrder
,我创建了一个反向排序的队列和另一个正确排序的队列。
import java.util.Collections;
import java.util.Comparator;
import java.util.PriorityQueue;
public class TestReverseorder {
public static void main(String[] args) {
Comparator<String> comparator = new TestReverseorder().new StringLengthComparator();
PriorityQueue<String> reverse = new PriorityQueue<String>(10,
Collections.reverseOrder(comparator));
PriorityQueue<String> queue = new PriorityQueue<String>(10,comparator);
queue.add("1");
queue.add("12");
queue.add("123");
reverse.add("1");
reverse.add("12");
reverse.add("123");
while (!queue.isEmpty()) {
System.out.println(queue.poll());
}
while (!reverse.isEmpty()) {
System.out.println(reverse.poll());
}
}
public class StringLengthComparator implements Comparator<String> {
@Override
public int compare(String x, String y) {
// Assume neither string is null. Real code should
// probably be more robust
if (x.length() < y.length()) {
return -1;
}
if (x.length() > y.length()) {
return 1;
}
return 0;
}
}
}
它将打印输出
Normal Order:
1
12
123
Reverse Order:
123
12
1