java1.7之后的比较器特别之处


在jdk1.7环境下使用Collectons.sort()方法:

  比如:Collections.sort(list, new Comparator<Integer>());

  就可能会出现异常:
     java.lang.IllegalArgumentException: Comparison method violates its general contract!


意思是:参数不符合要求。
    其实是第二个参数,比较器的问题。

jdk升级之后,对比较器的逻辑进行了严格要求,所以在大于或者等于或者大于等于的地方,很容易出错。


解决方案:

 1. 在Collections.sort(xxx,xxx); 方法之前,加上一句话:     System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");  
    使之能够按照升级之前的逻辑来比较。

 2.在比较器中修改,完善逻辑。

   比如:

       public int compare(ComparatorTest o1, ComparatorTest o2) {
         return o1.getValue() > o2.getValue() ? 1 : -1;
      }

      改为:

       public int compare(ComparatorTest o1, ComparatorTest o2) {
         return o1.getValue() == o2.getValue() ? 0 : (o1.getValue() > o2.getValue() ? 1 : -1);
      }

    这样让逻辑更加严谨。


相关链接:

  http://jxlanxin.iteye.com/blog/1814164

  http://ju.outofmemory.cn/entry/63413

      http://www.ithao123.cn/content-8176238.html


 

posted @ 2017-05-09 13:35  浪里小白龙呼呼呼  阅读(279)  评论(0编辑  收藏  举报