//实体类 如果自定义比较器可以不实现Comparable接口
public class User implements Comparable<User>{
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +"name='" + name + '\'' +", age=" + age +'}';
}
@Override
public int compareTo(User user) {
return this.age-user.age;
}
}
1.使用 Collections 工具类中的 sort() 方法( list是空集合不会报错,如果是null回报npe)
参数不同: Collections.sort(List list) 在自定义类User里面实现Comparable<User>接口,并重写抽象方法compareTo(Student o); //基本不用
Collections.sort(List list, Comparator c) 第二个参数为了省事,可以直接使用匿名内部类
public static void main(String[] args) {
User user1 = new User();
user1.setName("a");
user1.setAge(211);
User user2 = new User();
user2.setName("b");
user2.setAge(985);
User user3 = new User();
user3.setName("c");
user3.setAge(666);
User user4 = new User();
user4.setName("d");
user4.setAge(985);
List<User> userList = Arrays.asList(user1,user2,user3,user4);
System.out.println(userList);
String myName="e";
Collections.sort(userList);
// 使用 Comparator 自定义排序规则
Collections.sort(userList, Comparator.nullsLast(Comparator.naturalOrder()));
Collections.sort(userList, new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
//o1是后面的元素 o2是前面的元素
//指定值排在第一位(比如我的成绩)
if(myName.equals(o1.getName())){
return -1;
}
//如果年纪不相等直接大的年纪在后
if(o1.getAge()-o2.getAge()!=0){
return o1.getAge()-o2.getAge();
}
return o1.getName().compareTo(o2.getName());
}
});
System.out.println(userList);
}
2.使用list本身的sort方法
java8使用 Comparator.comparing 进行多字段排序
//studentsList本身元素会改变
userList.sort(Comparator.comparing(User::getAge).reversed());
userList.sort(new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
return o1.getAge() - o2.getAge()!=0?o1.getAge() - o2.getAge():o1.getName().compareTo(o2.getName());
}
});
//studentsList作为数据源,本身元素不会改变
List<User> studentsList= userList.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());
//按照名称主排序;年龄副排序
List<User> studentsList1 = userList.stream().sorted(Comparator.comparing(User::getName).thenComparing(
User::getAge, (s1, s2) -> {
return (s1 < s2) ? 1 : ((s1.intValue()== s2.intValue()) ? 0 : -1);
})).collect(Collectors.toList());
另一文章: java list排序的两种方式(实现Comparable接口和Collections.sort重载方法)_qq_31459039的博客-CSDN博客_list实现comparable