JAVA对象排序

JAVA对象排序

原贴地址 https://blog.csdn.net/yinxianluo/article/details/43761425

项目中需要对List对象按多个字段以及不同的方式排序,前思后想,实在是黔驴技穷,就看了下网上的文章,然后结合自己的理解,做一些学习记录。

技能点:Comparable和comparator的使用。

先看个例子

有学生类,属性为 name、gender、id,要求先按 name排序,如果name相同就按id


public class Student{
	private Long id;
	private String name;
	private String gender
  
  //省略 set 和 get
}

自己盲想了下,要是自己从0实现,应该先按id排序(冒泡、快排等,需要稳定排序),然后对排好序的list,再按name排序,不知道有没有更优的方法。 这里先不做过多解释,往下看

两种方法

先假设有三个学生

id姓名性别
1宋超
2吴淞
3宋超

1. Comparable接口

在实体类中实现Comparable接口,修改👆实体类如下,

public class Student implements Comparable<Student>{
	private Long id;
	private String name;
	private String gender
  
  //省略 set 和 get
    
  //实现接口中的方法
   public int compareTo(Student that) {
    	if(this.name.compareTo(that.name) == 0) {
        return Integer.valueOf(this.id).compareTo(Integer.valueOf(that.id))
      }else {
        return this.name.comparaTo(that.name);        //这里按排序方式倒序,最开始的放到最底下,如这里先按name排序,如果name相同,在判断id
      }
  }
}

使用方法:

List<Student> students = new ArrayList<Student>;
//添加student1、student2、student3等
Collections.sort(students);

排序结果如下

1 宋超 男

2 宋超 女

3 吴淞 男


2. comparator

第一种方式是接口,也就是说实体类必须实现接口以及其中的方法,而comparator是比较器,不必继承Comparable接口,也不必在实体类中实现方法。

所以直接看代码调用

Collections.sort(students, new Comparator<Student>) {
  
  @Override
	public int compare(Student this, Student that) {
		if(this.name.compareTo(that.name) == 0) {
        return Integer.valueOf(this.id).compareTo(Integer.valueOf(that.id))
      }else {
        return this.name.comparaTo(that.name); 
      }
	}
};

这种使用方式更灵活,更方便,结果和第一种相同


注意点

区分从大到小排序和从小到大排序,上面的情况显然是从小到大排序,如果需要从大到小排序,只需要将参数顺序进行修改即可:

Collections.sort(students, new Comparator<Student>) {
  
  @Override
	public int compare(Student this, Student that) {
		if(that.name.compareTo(this.name) == 0) {
        return Integer.valueOf(that.id).compareTo(Integer.valueOf(this.id))
      }else {
        return that.name.comparaTo(this.name); 
      }
	}
};

注意看this和that的区别

引申

以上的集合的排序,实际 Arrays和Array也是类似

Collections是个工具类,专门操作集合

Arrays也是工具类,操作array

对排序字段为null的处理,https://www.cnblogs.com/igoodful/p/9517784.html

对你有用的话就顺手点击下面的👍支持一下作者吧!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值