java升序问题_java 1.7 中 Collections.sort的排序问题

本文介绍了在Java 1.7中使用Collections.sort进行升序排序时可能出现的问题,特别是当自定义比较器不遵循Comparator的原则时会导致IllegalArgumentException。通过展示错误的比较器代码并详细解释其违背的排序原则,文章提出了手动实现快速排序的替代方案,以解决特定业务场景下的排序需求。
摘要由CSDN通过智能技术生成

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

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

}

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

while(y>=r && i

i++;

}

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

if(i

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值