zoukankan      html  css  js  c++  java
  • java-collections.sort异常Comparison method violates its general contract!

    异常信息

    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:408)
    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)
    ...

    原因

    JDK7中的Collections.Sort方法实现中,如果两个值是相等的,那么compare方法需要返回0,否则 可能 会在排序时抛错,而JDK6是没有这个限制的。

    if (len2 == 0) {
        throw new IllegalArgumentException("Comparison method violates its general contract!");
    }

     在 JDK7 版本以上,Comparator 要满足自反性,传递性,对称性,不然 Arrays.sort,

    Collections.sort 会报 IllegalArgumentException 异常。

    说明:

    1) 自反性:x,y 的比较结果和 y,x 的比较结果相反。

    2) 传递性:x>y,y>z,则 x>z。

    3) 对称性:x=y,则 x,z 比较结果和 y,z 比较结果相同。

    反例:下例中没有处理相等的情况,实际使用中可能会出现异常:

    new Comparator<Student>() {
        @Override
        public int compare(Student o1, Student o2) {
            return o1.getId() > o2.getId() ? 1 : -1;
        }
    } 
  • 相关阅读:
    c++ explicit 用法摘抄
    FBX SDK 从2012.1 到 2013.3 变化
    虚幻4 虚拟漫游场景 制作过程
    3DMAX 建立场景 工作流程
    保存路径选择对话框
    MFC 简单输出EXCEL
    快速使用Log4Cpp
    C# 调用 MFC DLL
    VS建立可供外部调用的MFC类DLL,C#调用MFC调用
    面试中被问到 “你对加班的看法” 该如何回答?
  • 原文地址:https://www.cnblogs.com/hwaggLee/p/5630784.html
Copyright © 2011-2022 走看看