2016-11-14 23 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 
     } 
    } 

}