Java 杂谈

java 1.7 中 Collections.sort的排序问题

2019-05-31  本文已影响0人  该账号已被注销_e09b

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

    }

上一篇下一篇

猜你喜欢

热点阅读