PriorityBlockingQueue按布尔比较排序

时间:2016-11-14 19:25:25

标签: java multithreading threadpool priority-queue

public class CompareOrder<T extends Priority> implements Comparator<T> {

    @Override
    public int compare(T left, T right) {
        return Boolean.compare(left.getSeverity(), right.getSeverity());
    }
}

我有PriorityBlockingQueue我通过比较器:

new PriorityBlockingQueue<>(size, new CompareOrder());

我想根据布尔值来排序这个队列,其中true值是要处理的队列中的第一个值。如何在compare()方法中进行比较,以便将真值排序为优先级?

2 个答案:

答案 0 :(得分:1)

在当前的实施中,false值将首先出现。 反过来说,你可以否定顺序:

class CompareOrder<T extends Priority> implements Comparator<T> {
    @Override
    public int compare(T left, T right) {
        return -Boolean.compare(left.getSeverity(), right.getSeverity());
    }
}

可替换地, 你可以保持compare实现相同, 但请将比较器包装在Collections.reverseOrder

new PriorityBlockingQueue<>(size, Collections.reverseOrder(new CompareOrder<>()));

答案 1 :(得分:0)

比较器的工作方式如下:

left - right < 0表示left位于队列的前面

left - right > 0表示左侧位于队列的后方

如果它们相等,那么您将返回0

在您的情况下,您希望真值位于队列的前面。因此,比较两个布尔值。返回-1+1,具体取决于哪一个为真,哪一个为假。

public class CompareOrder<T extends Priority> implements Comparator<T> {

    @Override
    public int compare(T left, T right) {
        if(left.getSeverity() && !right.getSeverity()){
          return -1; //push left true up the queue
        } else if(right.getSeverity() && !left.getSeverity()) {
          return 1;  //push left false down the queue
        } else {
          return 0;  //they are the same..do nothing
        }
    }

}