Java中List集合默认排序和自定义排序问题

1.List默认排序

List<Integer> list = new ArrayList<Integer>();
list.add(3);
list.add(1);
list.add(2);

//Collections类中的静态方法sort是可以对List集合进行排序操作的
Collections.sort(list);

System.out.println(list); // [1, 2, 3]

注意:但是,这只能对数值,英文字符串等基础数据结构进行排序,有局限。

2. List集合自定义排序

如果一个list集合中存放的是User对象,需要按照年龄age升序排序,那就需要自定义比较规则了。

User类:
	public class User {
		int age;
		int name;
		public User(int age, int name) {
			this.age = age;
			this.name = name;
		}
	}

2.1 方式1:让User类实现Comparable接口,重写compareTo方法。

重构User类如下:
	public class User implements Comparable<User>{
		int age;
		String name;
		public User(int age, String name) {
			this.age = age;
			this.name = name;
		}
		// 重写compareTo,该方法返回int值,不在乎具体值是多少,只在乎该值是 >0,<0还是=0
		// <0:当前对象比传入对象小。   
	    // =0:当前对象等于传入对象。
	    // >0:当前对象比传入对象大。
		@Override
		public int compareTo(User o) {
			//比较条件我们定的是按照age升序
			int s = this.age - o.age; 
			return s;
		}
		@Override
		public String toString() {
			return "User [age=" + age + ", name=" + name + "]";
		}	
	}

	测试代码:
	List<User> list = new ArrayList<User>();
	list.add(new User(3,"小李"));
	list.add(new User(1,"小张"));
	list.add(new User(2,"小王"));
	Collections.sort(list);
	System.out.println(list); //[User [age=1, name=小张], User [age=2, name=小王], User [age=3, name=小李]]

2.2 方式2: 实现Comparator接口,重写Comparator方法

注意:不是让User去实现该接口,而是另外定义一个类去实现,相比于让User去实现Comparable接口,代码耦合性更低。

//User是不作任何改动的
public class User{
	int age;
	String name;
	public User(int age, String name) {
		this.age = age;
		this.name = name;
	}
	@Override
	public String toString() {
		return "User [age=" + age + ", name=" + name + "]";
	}
}

//定义如下:可以理解为该类MyRule是一个专门用来定义比较规则的类,耦合性更低。
public class MyRule implements Comparator<User>{ 
	@Override
	public int compare(User o1, User o2) {
		return o1.age - o2.age;
	}
}

测试:
List<User> list = new ArrayList<User>();
list.add(new User(3,"小李"));
list.add(new User(1,"小张"));
list.add(new User(2,"小王"));

//sort(集合,比较器)
Collections.sort(list,new MyRule());

System.out.println(list); //[User [age=1, name=小张], User [age=2, name=小王], User [age=3, name=小李]]
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值