2016-06-01 12 views
0

私はマップ内の日付属性に基づいてList<Map<string,Object>をソートしようとしています。ここに私が使用したコードがあります。しかし、次のように例外がスローされます。比較方法は一般契約に違反しています。マップの比較に基づいて

コード:

Collections.sort(dataList,new Comparator<Map<String, Object>>() { 

     public int compare(Map<String, Object> o1, Map<String, Object> o2) { 
      SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy"); 

      Date date1 = null; 
      Date date2 = null; 
      try { 
       date1 = formatter.parse(o1.get("date").toString()); 
       date2 = formatter.parse(o2.get("date").toString()); 
      } catch (ParseException e) { 

      } 
      if(date1!=null && date2!=null){ 
       return date1.compareTo(date2); 
      }else { 
       return 0; 
      } 

     } 
    }); 

例外:

java.lang.IllegalArgumentException: Comparison method violates its general contract! 
at java.util.TimSort.mergeHi(TimSort.java:868) 
at java.util.TimSort.mergeAt(TimSort.java:485) 
at java.util.TimSort.mergeCollapse(TimSort.java:410) 
at java.util.TimSort.sort(TimSort.java:214) 
at java.util.TimSort.sort(TimSort.java:173) 
at java.util.Arrays.sort(Arrays.java:659) 
at java.util.Collections.sort(Collections.java:217) 

誰も私は私のコードで問題を識別するのに役立ちますか。?お手伝いをしてください

答えて

2

あなたの比較は推移的ではありません。

  • オブジェクトA:null。
  • オブジェクトB:2000年1月1日
  • オブジェクトC:1月1日、2010年

A == B. A == C. B < C.