在实际开发中,我们往往会遇到按多个属性排序的需求,比如先按照学生分数降序排序,然后按照姓名升序排序。那这个要怎么实现呢?话不多说,请看代码:
package com.mayi1203.myproject.test;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* 学生
* @author 码蚁1203
* @date 2020年3月21日
*/
@Data
@AllArgsConstructor
public class Student {
/**
* 姓名
*/
private String name;
/**
* 分数
*/
private Integer score;
}
package com.mayi1203.myproject.test;
import java.util.Comparator;
/**
* 比较器
* @author 码蚁1203
* @date 2020年3月21日
*/
public class StudentComparator implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
// 按照分数降序排序
int result = o2.getScore().compareTo(o1.getScore());
// 如果分数相同
if(result == 0) {
// 按照姓名升序排序
result = o1.getName().compareTo(o2.getName());
}
return result;
}
}
package com.mayi1203.myproject.test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 测试类
* @author 码蚁1203
* @date 2020年3月21日
*/
public class Test {
public static void main(String[] args) {
List<Student> list = new ArrayList<>(10);
list.add(new Student("zhangsan", 80));
list.add(new Student("zhangwu", 80));
list.add(new Student("zhan", 90));
list.add(new Student("zhalian", 85));
list.add(new Student("shangtong", 87));
list.add(new Student("jingguo", 77));
list.add(new Student("zhn", 98));
list.add(new Student("zhangsan", 81));
list.add(new Student("lein", 77));
list.add(new Student("tingxia", 80));
System.out.println("-------------sort bofore------------");
for(Student stu : list) {
System.out.println(String.format("score: %d, name: %s", stu.getScore(), stu.getName()));
}
Collections.sort(list, new StudentComparator());
System.out.println("----------sort after-----------");
for(Student stu : list) {
System.out.println(String.format("score: %d, name: %s", stu.getScore(), stu.getName()));
}
}
}
打印结果:
-------------sort bofore------------
score: 80, name: zhangsan
score: 80, name: zhangwu
score: 90, name: zhan
score: 85, name: zhalian
score: 87, name: shangtong
score: 77, name: jingguo
score: 98, name: zhn
score: 81, name: zhangsan
score: 77, name: lein
score: 80, name: tingxia
----------sort after-----------
score: 98, name: zhn
score: 90, name: zhan
score: 87, name: shangtong
score: 85, name: zhalian
score: 81, name: zhangsan
score: 80, name: tingxia
score: 80, name: zhangsan
score: 80, name: zhangwu
score: 77, name: jingguo
score: 77, name: lein