欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Comparable接口

程序员文章站 2022-04-10 09:52:14
Comparable接口通常用来做排序,For the mathematically inclined, the relation that defines the natural ordering on a given class C is:{(x, y) such that x.compareTo(y) <= 0}.也就是下面代码的结果是(x,y),先x后yif(x.compareTo(y) <= 0){return 1}问题:Comparison method...

对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

本文地址:https://blog.csdn.net/root_zhb/article/details/107279971