美文网首页Java 杂谈
java 1.7 中 Collections.sort的排序问题

java 1.7 中 Collections.sort的排序问题

作者: 该账号已被注销_e09b | 来源:发表于2019-05-31 18:57 被阅读0次

    Java比较器代码 

    public int compare(Integer a, Integer b) {

                                return a > b ? 1 : -1;

                            }

    bug 点

    Comparator的实现必须保证以下几点:

            原则1. sgn(compare(x, y)) == -sgn(compare(y, x))

            原则2. (compare(x, y) > 0) && (compare(y, z) > 0) 意味着 compare(x, z) > 0

            原则3. compare(x, y) == 0 意味着对于任意的z:sgn(compare(x, z)) == sgn(compare(y, z)) 均成立

    违背了原则1:假设x的value为1,x的value也为1;那么compare(X, Y) ≠ –compare(Y, X) ,故会抛出java.lang.IllegalArgumentException的异常

    解决方式 由于业务不复杂就自己写了一个

    Dataline 是自己业务里面的类 比较的点是 gongchengliang 你们可以自己替换

    private static void QuickSort(List<DataLine> num, int left, int right) {

            //如果left等于right,即数组只有一个元素,直接返回

            if(left>=right) {

                return;

            }

            //设置最左边的元素为基准值

            DataLine key=num.get(left);

            double r=0;

            try {

                r= Double.valueOf(key.gongchengliang);

            }catch (Exception e){

            }

            //数组中比key小的放在左边,比key大的放在右边,key值下标为i

            int i=left;

            int j=right;

            while(i<j){

                double x=0;

                double y=0;

                try {

                    x=Double.valueOf(num.get(j).gongchengliang);

                }catch (Exception e){

                }

                try {

                    y=Double.valueOf(num.get(i).gongchengliang);

                }catch (Exception e){

                }

                //j向左移,直到遇到比key大的值

                while(x<=r && i<j){

                    j--;

                }

                //i向右移,直到遇到比key小的值

                while(y>=r && i<j){

                    i++;

                }

                //i和j指向的元素交换

                if(i<j){

                    DataLine dataLine=num.get(i);

                    num.set(i,num.get(j));

                    num.set(j,dataLine);

                }

            }

            num.set(left,num.get(i));

            num.set(i,key);

            QuickSort(num,left,i-1);

            QuickSort(num,i+1,right);

        }

    相关文章

      网友评论

        本文标题:java 1.7 中 Collections.sort的排序问题

        本文链接:https://www.haomeiwen.com/subject/lengtctx.html