当前位置: 移动技术网 > IT编程>开发语言>.net > Comparable接口

Comparable接口

2020年07月12日  | 移动技术网IT编程  | 我要评论

对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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网