java中如何求比较器的逆

java中如何求比较器的逆,java,generics,heap,priority-queue,comparator,Java,Generics,Heap,Priority Queue,Comparator,在一个方法中,我收到一个泛型对象作为参数。现在我想创建两个优先级队列。一个使用E使用的比较器,另一个使用E使用的比较器的相反队列(即,如果E使用“=”)。 请告诉我如何创建两个这样的队列 queue2=new PriorityQueue<E>(0,Collections.reverseOrder(e)); queue2=newpriorityqueue(0,Collections.reverseOrder(e)); 我得到的错误是reverseOrder不适用 请帮助查看。您的对

在一个方法中,我收到一个泛型
对象作为参数。现在我想创建两个优先级队列。一个使用E使用的
比较器
,另一个使用E使用的
比较器
的相反队列(即,如果E使用“=”)。 请告诉我如何创建两个这样的队列

queue2=new PriorityQueue<E>(0,Collections.reverseOrder(e));
queue2=newpriorityqueue(0,Collections.reverseOrder(e));
我得到的错误是
reverseOrder
不适用


请帮助查看。

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


创建没有比较器的第一个队列,您将在
compareTo
函数中获得排序,然后创建一个
java.util.Comparator
,它以相反的方式进行比较(只需调用a.compareTo(b),然后对结果求反),并使用该比较器创建第二个队列。

下面的程序描述了如何执行此操作

我有
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;
    }
}
}
的单个参数是比较器,而不是集合。对于您的代码,只需使用reverseOrder而无需参数。您还必须使用非零初始大小。下面的代码将起作用

queue2=new PriorityQueue<E>(1, Collections.reverseOrder());
queue2=newpriorityqueue(1,Collections.reverseOrder());

queue2=newpriorityqueue(0,Collections.reverseOrder(e));我得到的错误是reverseorder不适用。请帮助我,我从来都不知道那里有
集合。reverseOrder
。谢谢
queue2=new PriorityQueue<E>(1, Collections.reverseOrder());