Comparable和Comparator两个接口的区别及实现

本文介绍了Java中Comparable和Comparator接口在排序中的应用。Comparable用于类的自然排序,而Comparator则允许在排序时灵活定义规则。通过示例展示了如何在Person类中实现Comparable接口进行年龄升序排序,以及如何使用Comparator实现自定义排序,包括年龄和姓名的综合排序。
摘要由CSDN通过智能技术生成

Comparable:强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法 被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。实现 此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中 的键或有序集合中的元素,无需指定比较器。


Comparator:强行对某个对象进行整体排序。可以将Comparator 传递给sort方法(如Collections.sort或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或 有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。 

创建一个Person类,存储到ArrayList集合中完成指定排序操作。代码如下:

//一个简单的Person类
class Person{
	String name;
	int age;
	
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	@Override
	public String toString() {
		return "Person(\"" + name + "\", " + age + ")";
	}
}

public class SortDemo {
	public static void main(String[] args) {
		ArrayList<Person> list = new ArrayList<Person>();
		list.add(new Person("zhangsan", 20));
		list.add(new Person("lisi", 23));
		list.add(new Person("wangwu", 17));
		list.add(new Person("xiaoming", 19));
		
		//按照年龄排序 升序
		//Collections.sort(list); //直接这样写会报错,要求该list类型必须实现比较器Comparable接口
		
		for(Person p : list) {
			System.out.println(p.toString());
		}
	}
}

发现,当我们调用Collections.sort()方法的时候,程序会报错。 原因:如果想要集合中的元素完成排序,那么必须要实现比较器Comparable接口。 所以我们就完成了Person类的一个实现,代码修改如下:

class Person implements Comparable<Person>{
	String name;
	int age;
	
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	@Override
	public String toString() {
		return "Person(\"" + name + "\", " + age + ")";
	}

	@Override
	public int compareTo(Person o) {
		return this.age - o.age; //按照年龄升序
	}
}

 当Person类实现了Comparable接口之后,再执行Collections.sort(list); 语句就不会报错了。

输出结果:

Person("wangwu", 17)
Person("xiaoming", 19)
Person("zhangsan", 20)
Person("lisi", 23)

但是,上述方法只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。如果在使用的时候,想要多次定义类的排序规则,那么可以考虑使用独立的定义规则,采用Collections.sort(List list,Comparetor c)方式来自己定义规则,代码如下:

class Person2{
	String name;
	int age;
	
	public Person2(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	@Override
	public String toString() {
		return "Person(\"" + name + "\", " + age + ")";
	}
}

public class SortDemo2 {
	public static void main(String[] args) {
		ArrayList<Person2> list = new ArrayList<Person2>();
		list.add(new Person2("zhangsan", 20));
		list.add(new Person2("lisi", 23));
		list.add(new Person2("wangwu", 17));
		list.add(new Person2("xiaoming", 19));
		list.add(new Person2("lihua", 19));
		
		//按照年龄排序 升序
		Collections.sort(list, new Comparator<Person2>(){
			@Override
			public int compare(Person2 o1, Person2 o2) {
				return o1.age - o2.age; //按照年龄升序
			}
		}); 
		for(Person2 p : list) {
			System.out.println(p.toString());
		}
		System.out.println();
		
		//如果想要规则更多一些,可以参考下面代码
		Collections.sort(list, new Comparator<Person2>(){
			@Override
			public int compare(Person2 o1, Person2 o2) {
				int result = o1.age - o2.age; //按照年龄升序
				if(result == 0) { //若年龄相等,则按照姓名的首字母升序
					result = o1.name.charAt(0) - o2.name.charAt(0);
				}
				return result;
			}
		}); 
		for(Person2 p : list) {
			System.out.println(p.toString());
		}
	}
}

输出结果:

Person("wangwu", 17)
Person("xiaoming", 19)
Person("lihua", 19)
Person("zhangsan", 20)
Person("lisi", 23)

Person("wangwu", 17)
Person("lihua", 19)
Person("xiaoming", 19)
Person("zhangsan", 20)
Person("lisi", 23)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值