java中Comparable和Comparator

首先这个两个接口是干嘛的?

Arrays.sort()
collections.sort()
这两个方法分别是用来给 数组排序和给 集合排序
但是当我们数组中的值是 Object的时候 计算机不知道该怎么去比较

class Student{
	String name="";
	int age;
	int score;
	public Student(String name,int age,int score){
		this.name=name;
		this.age=age;
		this.score=score;
	}
}

Comparable 接口 实现

// Student类实现这个接口将会强制 实现 compareTo()方法
//这个接口相当于   自己本身 去与 传进来的对象去比较
class Student implements Comparable<Student>{
	String name="";
	int age;
	int score;
	public Student(String name,int age,int score){
		this.name=name;
		this.age=age;
		this.score=score;
	}
	@Override
	public int compareTo(Student o) {
		// TODO Auto-generated method stub
		//返回值为负数:  本对象 放在 穿件来的对象 前面  我们让她按照年龄排序
		//为正数 本对象 放在 传件来的对象 后面
		//返回值为零时 本对象等于 传进来的对象
		if(this.age<o.age){
			return -1;
		}else if(this.age>o.age){
			return 1;
		}else{
			return 0;
		}
	}
}
此时就可以比较排序了
public class Main {
	public static void main(String[] args){
		Student[] message={new Student("王老吉",20,50),
		new Student("零丁洋",20,51),new Student("康奶昔",15,60),
		new Student("惶恐滩",20,80),new Student("大腊肠",30,90)
				};
		Arrays.sort(message);
		for(int i=0;i<5;i++){
			System.out.println("姓名:"+message[i].name+"\t年龄:"+message[i].age+"\t成绩"+message[i].score);
		}
    }
}

将会按照年龄排序
姓名:康奶昔	年龄:15	成绩60
姓名:王老吉	年龄:20	成绩50
姓名:零丁洋	年龄:20	成绩51
姓名:惶恐滩	年龄:20	成绩80
姓名:大腊肠	年龄:30	成绩90

Comparator 接口 实现

//实现这个接口将会强制 实现 compare()方法

//这个方法相当于 让穿进来的两个对象 做比较
// 这个接口不是让 Student 实现的 而是相当于另外创建了一个专门用来比较的 比较器
class useAgeSort implements Comparator<Student>{
	@Override
	public int compare(Student o1, Student o2) {
		//返回值为负数: o1 放在 o2 前面 
		//为正数 o1 放在 o2 后面
		//返回值为零时 o1等于 o2
		if(o1.age<o2.age){
			return -1;
		}else if(o1.age>o2.age){
			return 1;
		}else{
			return 0;
		}
	}
}
按照年龄排序
此时我们应该调用 sort(list,比较器) sort 的这个重载方法
意思是 让他使用我们自己写的 比较器 去比较


public class Main {
	public static void main(String[] args){
		Student[] message={new Student("王老吉",20,50),
		new Student("零丁洋",20,51),new Student("康奶昔",15,60),
		new Student("惶恐滩",20,80),new Student("大腊肠",30,90)
				};
		useAgeSort bijiaoqi = new useAgeSort();//比较器对象
		Arrays.sort(message,bijiaoqi);
		for(int i=0;i<5;i++){
			System.out.println("姓名:"+message[i].name+"\t年龄:"+message[i].age+"\t成绩"+message[i].score);
		}
    }
}
结果
姓名:康奶昔	年龄:15	成绩60
姓名:王老吉	年龄:20	成绩50
姓名:零丁洋	年龄:20	成绩51
姓名:惶恐滩	年龄:20	成绩80
姓名:大腊肠	年龄:30	成绩90

这个两个接口的区别是什么?

Comparable: 在需要比较的类中 使用该接口 让他知道自己排序的时候该怎么排
Comparator: 定义一个 外置的  比较器 比较的时候 sort()把比较器传进去

为什么要存在两个这样功能差不多的接口?

实际案例:
我的软件要实现两个功能,一个是按年龄排序,一个是按成绩排序

class useAgeSort implements Comparator<Student>{
	@Override
	public int compare(Student o1, Student o2) {
		//返回值为负数: o1 放在 o2 前面 
		//为正数 o1 放在 o2 后面
		//返回值为零时 o1等于 o2
		if(o1.age<o2.age){
			return -1;
		}else if(o1.age>o2.age){
			return 1;
		}else{
			return 0;
		}
	}
}
class useScoreSort implements Comparator<Student>{
	@Override
	public int compare(Student o1, Student o2) {
		//返回值为负数: o1 放在 o2 前面 
		//为正数 o1 放在 o2 后面
		//返回值为零时 o1等于 o2
		if(o1.score<o2.score){
			return -1;
		}else if(o1.score>o2.score){
			return 1;
		}else{
			return 0;
		}
	}
}
直接定义两个比较器,想用那个用那个
但是在不需要实现那么多排序模式的时候就可以使用我们直接嵌入 student 类中的 Comparable: 接口了
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SUNbrightness

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值