对ArrayList中包含的对象排序
1、对象实现Comparable接口,则可在ArrayList中直接使用Collections的方法
//存在一个类Individual
public class Individual implements Comparable{
//存在属性,其余属性省略
private Integer makespan;
public Integer getMakespan() {
return makespan;
}
public void setMakespan(Integer makespan) {
this.makespan = makespan;
}
//存在重写方法,其余方法省略
@Override
public int compareTo(Object o) {
//比较需要满足自反性,传递性,对称性,否则Comparison method violates its general contract!
//here o1 and o2 is not null,so only compare 大小即可
if(makespan.compareTo(((Individual) o).getMakespan())<0){
return -1;
}else if(makespan.compareTo(((Individual) o).getMakespan())>0){
return 1;
}
return 0;
}
}
//存在一个ArrayList<Individual> population
//找出makespan最小的Individual对象
Individual min= Collections.min(population);
//找出makespan最大的Individual对象
Individual max = Collections.max(population);
//对所有个体按照makespan进行排序,从小到大
Collections.sort(population);
2、其他
https://www.cnblogs.com/renjiaqi/p/6429649.html
https://blog.csdn.net/mottohlm/article/details/80836415
1、问题:
Comparison method violates its general contract!
2、举例:
Comparator<Integer> c = (o1, o2) -> {
if (o1 > o2) {
return 1;
} else {
return -1;
}
};
当o1和o2相等时,o1和o2比较,返回-1,表示o1小于o2;
但是,o2比o1,结果返回还是-1,表示o2小于o1。
这样就有两个元素互换比较,o1<o2并且o2<o1这两个结果相互矛盾,在某些情况下会出现异常。
参考:https://blog.csdn.net/TomCosin/article/details/83381221
3、原因:JDK7中的Collections.Sort方法实现中,如果两个值是相等的,那么compare方法需要返回0,否则 可能 会在排序时抛错,而JDK6是没有这个限制的。
Sort方法不同:以前是归并排序,现在是TimSort
4、解决:比较需要满足自反性,传递性,对称性
说明:
1) 自反性:x,y 的比较结果和 y,x 的比较结果相反。
2) 传递性:x>y,y>z,则 x>z。
3) 对称性:x=y, x=z 比较结果和 y,z 比较结果相同
5、代码解决:
1、对比所有可能的情况
if(x.compareTo(y) < 0){
return 1;
}else if(x.compareTo(y) > 0){
return -1;
}
return 0;
2、或者改一下系统设置,还是选择使用老版本的排序方法
System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");
其他问题:Cannot invoke compareTo(int) on the primitive type int
如果是基本类型,int之类的,那就大于小于等于直接比较,不需要使用compareTo方法
若想使用,转Integer