【问题标题】:PriorityBlockingQueue Order by Boolean Compare布尔比较的 PriorityBlockingQueue 顺序
【发布时间】:2016-11-14 19:25:24
【问题描述】:
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() 方法中进行比较,以便将真实值作为优先级排序?

【问题讨论】:

  • 您能否在您的问题中解释一下您当前的代码有什么问题?有什么错误吗?
  • 泛型类型需要类型参数:new CompareOrder&lt;&gt;()
  • 不是一个好主意。最好有两个队列。
  • @EJP 两个队列的想法是什么?你能举个例子吗?

标签: java multithreading threadpool priority-queue


【解决方案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<>()));

【讨论】:

    【解决方案2】:

    Comparator 的工作方式如下:

    left - right &lt; 0 表示左边在队列的最前面

    left - right &gt; 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
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2019-05-28
      • 2012-08-19
      • 2017-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      相关资源
      最近更新 更多