java - 比较方法违反了它的一般契约!基于 map 比较

标签 java collections compare

我正在尝试对 List<Map<string,Object> 进行排序基于 map 内的日期属性。这是我使用的代码。但它会抛出异常,如下所示。

代码:

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;
            }

        }
    });

异常(exception):

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)

任何人都可以帮我找出我的代码的问题吗?感谢任何帮助

最佳答案

您的比较不具有传递性。

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

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

关于java - 比较方法违反了它的一般契约!基于 map 比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37559022/

相关文章:

java - java android 中的 Onclick 按钮语言更改

c# - #c (ArrayList) 中的集合在 for 循环或带有索引的 foreach 中

java - 何时应用操纵随机访问列表的算法?

java - Java中的集合和集合之间的主要区别是什么?

php - 与 echo 与返回连接时,句点和逗号之间的区别?

检查 C 中类似元素的数据数组

java - 将继承类型之间的关系建模为 ORM

Java - 为什么系统类和运行时类具有相同的方法?

java - 将 switch 语句与枚举一起使用

c - 二进制炸弹的汇编代码困惑