8

在一个方法中,我收到一个泛型object E extends Comparable<E>作为参数。现在我想创建两个优先级comparator队列。一个使用 E 使用的队列,另一个使用 E 使用的相反队列comparator(即,如果 E 使用'<',那么第二个队列必须使用'>=')。请帮助我如何创建两个这样的队列。

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

我收到reverseOrder不适用的错误。

请帮忙

4

4 回答 4

12

查看Collections.reverseOrder

于 2012-09-10T04:48:15.003 回答
5

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

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

于 2012-09-10T05:26:16.490 回答
1

Collections.reverseOrder的单个参数是比较器而不是集合。对于您的代码,只需使用没有参数的 reverseOrder。您也必须使用非零初始大小。以下代码将起作用。

queue2=new PriorityQueue<E>(1, Collections.reverseOrder());
于 2013-07-26T10:43:53.730 回答
0

下面的程序描述了如何做到这一点。

我有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
于 2012-09-10T05:59:56.880 回答