2012-07-20 89 views
0

我無法理清用我自己的比較實現我通過Collections.sort集合()。 引發的異常是 - >「拋出:IllegalArgumentException:比較法違反其總承包 在我OrdersBean我已經過纏身的hashCode,因爲這:的Java排序(TimSort-歸併):危險

@Override  
    public int hashCode() { 
    return this.getServiceOrderName().toUpperCase().hashCode(); 
} 

我還沒有過深重的equals()和使用!該Object類的只(不應該是一個問題,我覺得)

,我已經實現了比較,因爲這:

public static final Comparator<OrdersBean> ordersComparator=new Comparator<OrdersBean>() { 

    @Override 
    public int compare(OrdersBean first, OrdersBean second) 
    { 
     if(Double.parseDouble(first.getPriority())<Double.parseDouble(second.getPriority())) 
      return -1; 
     else 
      if(Double.parseDouble(first.getPriority())>Double.parseDouble(second.getPriority())) 
       return +1; 
      else 
      { 
       if((first.getPlatformType().equalsIgnoreCase("EV-DO Carrier ADD")) && 
         (second.getPlatformType().equalsIgnoreCase("EV-DO Carrier ADD"))) 
          return -1; 

       if((first.getPlatformType().equalsIgnoreCase("T1 Augment")) && 
         (second.getPlatformType().equalsIgnoreCase("T1 Augment"))) 
          return -1; 

       if(first.getPlatformType().equalsIgnoreCase("EV-DO Carrier ADD")) 
        return -1; 
       else 
        if(second.getPlatformType().equalsIgnoreCase("EV-DO Carrier ADD")) 
         return +1; 
        else 
         if(first.getPlatformType().equalsIgnoreCase("T1 Augment")) 
          return -1; 
         else 
          if(second.getPlatformType().equalsIgnoreCase("T1 Augment")) 
           return +1; 
          else 
           return -1; 
      } 

    } 
}; 

請給我建議,我要去的地方錯了???

我現在已經改變了代碼如下,它的運行良好的sort()方法,但它現在終於在這個比較傳遞給樹集,其中重複不準以後的代碼導致錯誤,因此,其中所述比較器返回0,那些命令不被添加到這個SortedSet的類似的平臺類型的所有情況下(爲重複是不允許的):

public static final Comparator<OrdersBean> ordersComparator=new Comparator<OrdersBean>() { 

    @Override 
    public int compare(OrdersBean first, OrdersBean second) 
    { 
     int diffProrties=(int)(Double.parseDouble(first.getPriority())-Double.parseDouble(second.getPriority())); 
     if(diffProrties != 0) 
      return diffProrties; 

     if(first.getPlatformType().equalsIgnoreCase(second.getPlatformType())) 
      return 0; 

     if(first.getPlatformType().equalsIgnoreCase("EV-DO Carrier ADD")) 
      return -1; 
     if(second.getPlatformType().equalsIgnoreCase("EV-DO Carrier ADD")) 
      return +1; 
     if(first.getPlatformType().equalsIgnoreCase("T1 Augment")) 
      return -1; 
     if(second.getPlatformType().equalsIgnoreCase("T1 Augment")) 
      return +1; 

     return 0; 


    } 
}; 
+2

你永遠不返回0?當你將一個對象與自己比較時會發生什麼? – SJuan76 2012-07-20 20:03:19

+0

它與需要某個分支返回0有什麼關係嗎? (打敗我吧,SJuan76!) – BlackVegetable 2012-07-20 20:03:29

+0

它也好像你的一些平臺類型檢查是多餘的。你需要明確比較兩個可能的值嗎?爲什麼不直接比較'first.getplatformType'到'second.getplatformtype'? – 2012-07-20 20:07:56

回答

5

compare(a,b)必須與-compare(b, a)相同否則沒有確定性的方法來比較a和b。你有

if((first.getPlatformType().equalsIgnoreCase("EV-DO Carrier ADD")) && 
    (second.getPlatformType().equalsIgnoreCase("EV-DO Carrier ADD"))) 
     return -1; 

這是說一個< B和B <一個這是沒有意義的。

+0

我同意你的看法,但是我之前將這種情況視爲平等的情況,當兩種平臺類型相同時,我返回0,但之後在應用程序的後期階段破壞了我的代碼,其中使用相同的比較器創建treeSet,在這種情況下,當它從compare()中得到0時,它不會將對象添加到集合中,因爲對象將會相等,所以我將放棄所有那些具有類似平臺類型的對象,要在兩個地方有效地使用,, – KDjava 2012-07-20 20:35:37

+3

你必須在不同的字段上進行比較,而不是返回0.樹集合不允許重複鍵,所以如果你想「複製」,你必須讓它們與衆不同。 。 – 2012-07-20 21:09:04

+1

您必須比較不同的字段,而不是返回0.集合不允許重複。如果你想複製你可以使用一個列表或添加一個字段,使鍵不同。 – 2012-07-20 21:24:16

3

比較器必須遵循contract,特別地,如果compare(A, B) < 0 ,那麼它必須是compare(B, A) > 0。如果您將平臺「EV-DO Carrier ADD」傳遞給兩個對象,則比較器將違反此規定。