【问题标题】:Comparison method violates its general contract! Based on Map comparison比较方法违反了它的总合同!基于地图比较
【发布时间】:2016-06-01 03:40:35
【问题描述】:

我正在尝试根据地图中的日期属性对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)

谁能帮我找出我的代码的问题。?感谢任何帮助

【问题讨论】:

    标签: java collections compare


    【解决方案1】:

    您的比较不具有传递性。

    • 对象 A:空。
    • 对象 B:2000 年 1 月 1 日。
    • 对象 C:2010 年 1 月 1 日。

    A == B. A == C. B

    【讨论】:

      猜你喜欢
      • 2016-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      相关资源
      最近更新 更多