如何在java中获得比较器的反转

在一个方法中,我收到一个通用object E extends Comparable作为参数。 现在我想创建两个优先级队列。其中一个使用E使用的comparator和其他使用E使用的comparator相反的队列(即如果E使用’ =’)。 请告诉我如何创建两个这样的队列。

 queue2=new PriorityQueue(0,Collections.reverseOrder(e)); 

我收到reverseOrder不适用的错误。

请帮忙

看看Collections.reverseOrder 。

您的对象E扩展了java.lang.Comparable,但它不是java.util.Comparator

用比较器创建你的第一个队列,你将获得compareTo函数的排序,然后创建一个java.util.Comparator ,它反向进行比较(只需调用a.compareTo(b)然后否定结果)和使用该比较器创建第二个队列。

Collections.reverseOrder的单个参数是Comparator而不是Collection。 对于您的代码,只需使用不带参数的reverseOrder。 您也必须使用非零的初始大小。 以下代码将起作用。

 queue2=new PriorityQueue(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 comparator = new TestReverseorder().new StringLengthComparator(); PriorityQueue reverse = new PriorityQueue(10, Collections.reverseOrder(comparator)); PriorityQueue queue = new PriorityQueue(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 { @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