2017-05-08 10 views
0

スレッド内でwhileループを処理する優先度キューがあります。いくつかのケースでは、私はキューの内容を取り、それを配列でソートする必要があります。 私はそれをこのように実行します。比較方法は一般契約に違反しています!優先度キューでエラーが発生しました

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'と比較するelseです(つまり、 .after() ')? – KevinO

+0

@KevinO、はい、ありがとう、あまりにもこのために疲れて.. – kitsuneFox

答えて

1

注文A、B、Cが同じブローカーを持ち、Aがヌル開始日、Bが開始日がであると仮定してコンパレータの実装が一般契約に違反している1/1/2017とCの開始日は、01/01/2018です。次いで

  1. Bに等しく、を比較することによって Cに等しいです。
  2. Bはコンパレータによって Cより大きい

したがって(2)矛盾(1)。

実装を修正するには、NullPointerExceptionのキャッチ(RunTimeExceptionをキャッチする習慣が悪い)を削除し、Orderのプロパティを比較するメソッドを追加し、nullの一貫比較を定義します。

関連する問題