1. 程式人生 > >Android碰到 "Comparison method violates its general contract" 異常的解決方法

Android碰到 "Comparison method violates its general contract" 異常的解決方法

1.概述:

 最近在對資訊進行排序時,做了一個簡單地比較器,當時在執行時並沒有報錯,但是,後臺資料重新整理時,我這邊就出了問題。在jdk1.6中,當我們比較的內容的值相同時,使用java自己的排序方法"Collections.sort()"是很正常的,可是到了jdk1.7,問題就會出現了,這種情就不再允許了,這是因為JDK7底層的排序演算法換了,JDK7中的Collections.Sort方法實現中要求,如果兩個值是相等的,那麼compare方法需要返回0,否則 可能 會在排序時拋錯(這個異常並不是頻繁出現的),而JDK6是沒有這個限制的。所以在比較時,我們必須要考慮兩個值相等的情況,而且返回的值需要為   0.

2.解決方法

如下程式碼,程式碼中8~9行增加了一句判斷兩個物件的值是否相同的語句,注意第9行,要求返回0(因為是判斷值是否相同,相同的話要求返回0,且必須是0),否則可能會報出異常.

public class PinyinComparator implements Comparator<DeptAddBookBean> {
1.public int compare(DeptAddBookBean o1, DeptAddBookBean o2) {
2.     if (o1.getLetter().equals("@") || o2.getLetter().equals("#")) {
3.            return
-1;
4.     } else if (o1.getLetter().equals("#") || o2.getLetter().equals("@")) {
5.            return 1;
6.      } else if (o1.getLetter().compareTo(o2.getLetter())>0) {
7.            return 1;
8.      }else if(o1.getLetter().compareTo(o2.getLetter())==0){
9.            return 0;//此處需要返回0;
10.    }else
{
11.          return
-1;
12.    }
13 .   }

      }

如上新增一句判斷兩個值相等的情況後,在呼叫Collections.sort(list,new PinyinComparator());方法進行排序,避免出現異常.