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
对你有用的话就顺手点击下面的👍支持一下作者吧!