必须要说的java对象排序(实现Comparable接口)

本文介绍了Java中对自定义对象进行排序的方法,强调了实现Comparable接口的重要性。通过Arrays.sort()和Collections.sort()对数组和List进行排序,以及TreeSet的自然排序,都需要对象遵循Comparable接口以确保正确排序。

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

java针对数组提供了一个Arrays.sort(Object[] a)的排序方法,针对List接口提供了Collections.sort(List<T> list)的排序方法。

TreeSet<E>类本身也是支持自然排序。

但是以上方法或类,针对基本数据类型或String还挺凑效,一旦针对自定义的类(引用数据类型),就会报错,那是因为少了下面这一步。

Exception in thread "main" java.lang.ClassCastException: xxx cannot be cast to java.lang.Comparable

说的就是某某类必须要转型为java.lang.Comparable。根据多态,也就是说目标类必须是Comparable的子类或实现类才行(这里的Comparable是接口,那么就只能实现了)。

自定义类:

//实现Comparable接口
public class User implements Comparable<User> {

	private int id;
	
	private String name;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public User() {
		super();
	}

	public User(int id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + "]";
	}
	

	//按照id排序
	@Override
	public int compareTo(User user) {
		//return this.id > user.getId() ? 1 : (this.id == user.getId() ? 0 : -1);
		if(this.id > user.getId()) {
			return 1;
		}else if(this.id == user.getId()) {
			return 0 ;
		}else {
			return -1;
		}
	}
}

测试类:

public class Test {

	public static void main(String[] args) {
		User u1 = new User(1, "zhangsan");
		User u2 = new User(2, "lisi");
		User u3 = new User(3, "wangwu");
		User [] users = {u3, u2, u1};
		
		Arrays.sort(users);
		for(User u : users) {
			System.out.println(u.toString());
		}
		
		System.out.println("==================================================");
		
		Set<User> set = new TreeSet<>();
		set.add(u2);
		set.add(u3);
		set.add(u1);
		for(User u : set) {
			System.out.println(u.toString());
		}
		
		System.out.println("==================================================");
		
		List<User> list = new ArrayList<User>();
		list.add(u2);
		list.add(u3);
		list.add(u1);
		Collections.sort(list);
		for(User u : list) {
			System.out.println(u.toString());
		}
	}
}

运行结果:

User [id=1, name=zhangsan]
User [id=2, name=lisi]
User [id=3, name=wangwu]
==================================================
User [id=1, name=zhangsan]
User [id=2, name=lisi]
User [id=3, name=wangwu]
==================================================
User [id=1, name=zhangsan]
User [id=2, name=lisi]
User [id=3, name=wangwu]

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值