如何在java中获取比较器的倒数



在一个方法中,我接收一个泛型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),然后对结果求反),并使用该比较器创建第二个队列。

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

最新更新