2017-05-08 53 views
0

我有一個優先級隊列,在一個線程內的while(true)循環中進行操作。在某些情況下,我想要將隊列內容和數組排序。 我做這種方式:比較方法違反其總合同!優先級隊列錯誤

Object[] array = sellQueues[0].toArray(); 
Arrays.sort(array); 

優先級隊列的比較方法如下:

public int compare(Order o1, Order o2) { 
      try { 
       if (o1.getBroker().getOrdersPriority() > o2.getBroker().getOrdersPriority()) 
        return 1; 
       else if (o1.getBroker().getOrdersPriority() < o2.getBroker().getOrdersPriority()) 
        return -1; 
       else { 
        if (o1.getBeginDate().before(o2.getBeginDate())) 
         return 1; 
        else if (o1.getBeginDate().after(o2.getBeginDate())) 
         return -1; 
        else { 
         if (o1.getBeginTime().before(o2.getBeginTime())) 
          return 1; 
         else if (o1.getBeginTime().before(o2.getBeginTime())) 
          return -1; 
         else 
          return 0; 
        } 
       } 
      } catch (NullPointerException e) { 
       return 0; 
      } 
     } 

出於某種原因,有時我得到的錯誤:

java.lang.IllegalArgumentException: Comparison method violates its general contract!

+1

***出於某種原因,有時我得到錯誤.... ***我們如何能夠幫助這樣的描述性信息? –

+0

我的眼睛正在發展,還是比較'o1.getBeginTime()'在'if'和'else if'中做同樣的'.before'的其他東西(也就是說,不應該是' 。經過()')? – KevinO

+0

@KevinO,是的,謝謝,太累了.. – kitsuneFox

回答

1

的因爲: 假設訂單A,B,C具有相同的經紀人,A具有空開始日期,B具有開始日期 1/1/2017和C的開始日期01/01/2018。然後

  1. 等於 B和A 由比較等於℃。
  2. B是由比較器比 C時

因此(2)頂撞(1)。

要更正實現,請刪除NullPointerException(不良習慣捕獲RunTimeException)的catch,添加方法以比較Order的屬性,併爲null定義一致的比較。

相關問題