比较器Comparator/Comparable详解

前言:文字太多容易反感。仔细看代码及其注释,让代码说明一切!

目录

Comparator

Comparable


Comparator

代码1:

package collection2;
import java.util.Comparator;
import java.util.Iterator;
/*compareTo方法--------
 * public int compareTo(Integer anotherInteger){
return compare(this.value,anotherInteger.value);
}
String的compareTo方法---------
public int compareTo(String anotherInteger){}
*/
/*
 * 按自己的规则排序:重写compareTo方法
 * 二叉树比较:先跟根节点比,如果比它小就放到左子树;如果下一个树进来后比它大则跟右边的比
 */
import java.util.TreeSet;

class MyComparator implements Comparator{
	public int compare(Object o1,Object o2){
		System.out.println(o1+" 和 "+o2+" 比");
		Integer i1=(Integer)o1;
		Integer i2=(Integer) o2;
		return i2-i1;   //如果i1>i2肯定返回一个大于0的值
//		if(i1>i2) return 1;   //返回一个大于0的值
//		else if(i1<i2) return -1;
//		else return 0;
	}
}
//TreeSet的构造器中要传入一个Comparator类型的参数
public class SortedSetTest2 {
public static void main(String args[]){
	MyComparator m=new MyComparator();
	TreeSet set=new TreeSet(m);
	set.add(234);
	set.add(4);
	set.add(18);
	set.add(762);
	set.add(38);
	Iterator it=set.iterator();
	while(it.hasNext()){
		System.out.println(it.next()+" ");   //默认自然数排序
	}
}
}

/*
234 和 234 比
4 和 234 比
18 和 234 比    先跟根节点比,放左边
18 和 4 比        再跟4比,比4大,放4的右子树,此时两边不平衡,根节点转换为18,18作为234的左子树,然后将234向下挪
762 和 18 比    762比18大,再去跟18的右子树也就是跟234比
762 和 234 比
38 和 18 比
38 和 234 比

*/

代码2:

package collection2;
/*
 * 计算机中,return 只要是个大于0的值,那么计算机认为一定是i1>i2;
 * 或者说是234进去后,执行4-234,计算机执行时4-234<0,实际上234-4>0 即4应该放右边
 * 也就是说,如果自己想重写compare方法来使其倒序输出,可以return i2-i1;
 * return this.age17-p.age19;jsj减出来是大于0
 * 判断大于0:i1>i2,i1放到右子树,如果return i2-i1;即i2>i1,实际上i1<i2,右子树放小的数,
 */
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

class MComparator implements Comparator{
	public int compare(Object o1,Object o2){
		System.out.println(o1+" 和 "+o2+" 比");
		Integer i1 =(Integer)o1;
		Integer i2=(Integer)o2;
//		return i1-i2;
//		return i2-i1;
//		return -i2.compareTo(i1); 
		return i2.compareTo(i1);   //因为Integer本身有自然排序规则
	}

}

public class SortedSetTest3 {
public static void main(String args[]){
	MComparator m=new MComparator();
	TreeSet set=new TreeSet(m);
	set.add(234);
	set.add(4);
	set.add(18);
	set.add(762);
	set.add(38);
	Iterator it=set.iterator();
	while(it.hasNext()){
		System.out.println(it.next()+" ");   //默认自然数排序
	}
}
}


Comparable

package collection2;
import java.util.TreeSet;
/**
 * TreeSet:有序不重复,(底层维护的时TreeMap的实例)
 * @author HYZX
 * 要对Person进行自然排序,显然与Comparable接口的自然排序冲突,此时需要Person类实现Comparable接口
 * return p.age-this.age;计算机当作是(return this.age-p.age)
 * 返回>0的值代表this大于这个值,而如果交换,结果小于0代表this小于这个值,会将this放到左子树,而this实际上是大的那个值,
 * 如果写成了return p.age-this.age,也就是左边成了大的,右边成了小的
 */
class Person implements Comparable{
	String name;
	int age;
	String sex;
	public Person(){}
	public Person(String n,int a,String sex){
		this.name=n;
		this.age=a;
		this.sex=sex;
	}
	//实现了Comparable接口,因此可以调用compareTo方法
	public int compareTo(Object obj) {
		Person p=(Person)obj;
		if(this.age==p.age){
			return this.name.compareTo(p.name); //如果年龄相等就按照姓名排序
		}
		else {
		    return this.age-p.age;  
		}
//		return p.age-this.age;  //按年龄倒序输出,相同年龄的只能加入第一个,后续年龄重复的加不进去。
//		return this.name.compareTo(p.name);  //按姓名字符串顺序输出
	}
	public String toString(){
		return "姓名:"+this.name+",年龄:"+this.age+",性别:"+this.sex;
	}
}
public class PersonSorted {
public static void main(String args[]){
	TreeSet set=new TreeSet();
	set.add(new Person("zhangsan",21,"女"));
	set.add(new Person("aaaa",21,"女"));  //如果年龄相同,先输出的将是此句
	set.add(new Person("wangwu",24,"男"));
	set.add(new Person("wanu",24,"男"));
	set.add(new Person("lisi",22,"男"));
	set.add(new Person("lisi",22,"男"));
	for(Object o:set){
		System.out.println(o+" ");
	}
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ProblemTerminator

您的鼓励将是作者最大的动力哦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值