2016-11-14 8 views
1
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 где я прохожу компаратор:PriorityBlockingQueue Сортировать по булеву Сравнить

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

Я хотел бы заказать эту очередь на основе логических значений, где true значений являются первыми в очереди, подлежащую обработке , Как сравнить метод compare(), чтобы истинные значения упорядочивались как приоритет?

+0

Не могли бы вы объяснить в своем вопросе, что не так с вашим текущим кодом? Любые ошибки? – 4castle

+0

Типичные типы типа типа: 'new CompareOrder <>()' – 4castle

+0

Не отличная идея. Вам будет лучше с двумя очередями. – EJP

ответ

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<>())); 
0

Путь, что Компаратор работает следующим образом:

left - right < 0 означает, что слева находится в передней части очереди

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 
     } 
    } 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^