当前位置:   article > 正文

java.util.Collections#sort() throws IllegalArgumentException_collections.sort会报illegalargumentexception异常

collections.sort会报illegalargumentexception异常

问题

JDK6升级JDK7的情况下,由于java.util.Arrays.sort和java.util.Collections.sort使用的排序算法已被替换(mergesort → timsort)。当TimSort检测到待比较的项目违反约定,则可能抛出IllegalArgumentException。JDK6及以前的版本忽略了这种情况。如果需要以前的行为,可以使用新的系统属性java.util.Arrays.useLegacyMergeSort来恢复以前的mergesort行为。


    /**
     * 
     * @param <T> the class of the objects to be sorted
     * @param a the array to be sorted
     * @param c the comparator to determine the order of the array.  A
     *        {@code null} value indicates that the elements'
     *        {@linkplain Comparable natural ordering} should be used.
     * @throws ClassCastException if the array contains elements that are
     *         not <i>mutually comparable</i> using the specified comparator
     * @throws IllegalArgumentException (optional) if the comparator is
     *         found to violate the {@link Comparator} contract
     */
    public static <T> void sort(T[] a, Comparator<? super T> c) {
        if (c == null) {
            sort(a);
        } else {
            if (LegacyMergeSort.userRequested)
                legacyMergeSort(a, c);
            else
                TimSort.sort(a, 0, a.length, c, null, 0, 0);
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

Collections.sort方法的说明
简单的来说:

  1. 恒满足 compare(x, y) = - compare(y, x)compare(x, y) 抛出异常,compare(y, x)也必须抛出异常
  2. (compare(x, y)>0compare(y, z)>0),可以推导出 compare(x, z) > 0
  3. compare(x, y)==0,推导出对任意元素z,恒满足compare(x, z) = compare(y, z)

解决方案

设置JVM启动参数,使用JDK6的默认排序方法。

-Djava.util.Arrays.useLegacyMergeSort=true
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/67413
推荐阅读
相关标签
  

闽ICP备14008679号