如何在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