Comparable<T> 和 Comparator<T> 排序对比

本文深入解析Java中的排序机制,详细阐述Comparable与Comparator的区别与应用,包括如何实现自定义类的排序,以及通过实例演示如何使用Collections.sort进行升序与降序排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.前言

Comparable 简介

Comparable 是排序接口。

若一个类实现了Comparable接口,就意味着“该类支持排序”。
即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过
Collections.sort(或 Arrays.sort)进行排序。

此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。

Comparator 简介

Comparator 是比较器接口。

我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。

也就是说,我们可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。

Comparator 和 Comparable 比较

Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。
而Comparator是比较器;我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。

我们不难发现:Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

compareTo 方法

compareTo() 方法用于将 Number 对象与方法的参数进行比较。可用于比较 Byte, Long, Integer等。 语法
public int compareTo( NumberSubClass referenceName ) 参数 referenceName
– 可以是一个 Byte, Double, Integer, Float, Long 或 Short 类型的参数。

返回值 如果指定的数与参数相等返回0。

如果指定的数小于参数返回 -1。

如果指定的数大于参数返回 1。

2.使用Comparable进行排序操作

注:此方法 实现 Comparable 接口,并重写 compareTo 方法进行比较。后台则以:Collections.sort(cList); 进行调用

public class User implements Comparable<User>{
	private Integer id;
	private String userName;
// 省略 setter/getter方法

	/**
	 * 根据 ID 进行排序
	 *  0     表示两个对象相等
	 *  1     前面小后面大升序
	 *  -1    后面的对象大于前面的对象   降序
	 */
	@Override
	public int compareTo(User user) {
		int result = 0;
		if(user != null){
			if(null == this.id && null == user.id){
				result = 0;
			}else if (null != this.id && null == user.id){
				result = 1;
			}else if (null == this.id && null != user.id){
				result = -1;
			}else {
				result = this.id.compareTo(user.id);
			}
		}
		return result;
	}
}

后台调用,造数据进行比较

    @Test
    public void sortUser(){
	    List<User> cList = new ArrayList<>();
	    User user2 = new User();
	    User user3 = new User();
	    User user4 = new User();
	    User user5 = new User();
	    User user0 = new User();
	    user2.setId(2);
	    user3.setId(3);
	    user4.setId(4);
	    user5.setId(5);
	    user0.setId(0);
	    cList.add(user2);
	    cList.add(user3);
	    cList.add(user4);
	    cList.add(user5);
	    cList.add(user0);
	    Collections.sort(cList);
	    for (User u : cList){
	    	System.out.println(u.getId());
	    }
	    //输出结果: 0 2 3 4 5 
    }

3.使用 Comparator 比较器进行排序

此方式有两种方式:
1.需要新建一个排序类 实现 Comparator 接口,并重写 compare 方法。后台则以:Collections.sort(cList,new 排序类()); 进行调用
2.直接在 Collections.sort(cList,new Comparator(new Comparator() {
@Override
public int compare(User user, User user2) {
return 0; /
}

第一种:创建排序类,实现Comparator 接口,针对 User 类 降序

public class UserCompar implements Comparator<User> {
	@Override
	public int compare(User user, User user2) {
		int num = user.getId();
		int num2 = user2.getId();
		return -(num - num2);  //降序排列
	}
}
// 实现:
Collections.sort(cList,new UserCompar());
	for (User u : cList){
	 System.out.println(u.getId());
	}
	    输出结果:5 4 3 2 0

第二种:直接 new Comparator() 进行对比

 Collections.sort(cList, new Comparator<User>() {
		    @Override
		    public int compare(User user, User user2) {
			    int num = user.getId();
			    int num2 = user2.getId();
			    return -(num - num2);  //降序排列
		    }
	    });

	    for (User u : cList){
		    System.out.println(u.getId());
	    }
	    输出结果:5 4 3 2 0

很显然:第一种和第二种得出的结果是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值