1.前言
在工作中我们常常需要对一些集合进行排序操作,那么我们就可以使用java集合的工具类Collections
来完成相应的操作。这篇文章大概回顾一下具体的使用操作。
java集合的工具类Collections中提供了两种排序的方法,分别是:
Collections.sort(List list) //自然排序
Collections.sort(List list,Comparator c) //自定义排序
2.Collections.sort(List list) 自然排序
自然排序,参与排序的对象需实现comparable接口,重写其compareTo()方法。
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Data
public class User implements Comparable{
private String name;
private int age;
@Override
public int compareTo(Object o) {
if(o instanceof User){
User user = (User) o;
return this.age - ((User) o).age;
}
throw new ClassCastException("不能转换为User类型的对象...");
}
}
@Test
void outLogger() throws Exception {
List<User> list = new ArrayList<>();
list.add(new User("张三",22));
list.add(new User("李四",45));
list.add(new User("司总",18));
Collections.sort(list);
list.forEach(v ->{
System.out.println(v.toString());
});
}
输出结果:
User(name=司总, age=18)
User(name=张三, age=22)
User(name=李四, age=45)
注意:
这种方法不够灵活,实体类实现了comparable接口后,会增加耦合,如果在项目中不同的位置需要根据不同的
属性调用排序方法时,需要反复修改比较。
3.Collections.sort(List list,Comparator c) 自定义排序
需编写匿名内部类,先new一个Comparator接口的比较器,同时实现compare()方法。
@Test
void outLogger() throws Exception {
List<User> list = new ArrayList<>();
list.add(new User("张三",22));
list.add(new User("李四",45));
list.add(new User("司总",18));
Collections.sort(list, new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
return o2.getAge() - o1.getAge();
}
});
list.forEach(v ->{
System.out.println(v.toString());
});
}
输出结果:
User(name=李四, age=45)
User(name=张三, age=22)
User(name=司总, age=18)
4.JDK1.8更方便排序处理
案例1:Comparator.reverseOrder()反自然排序
@Test
void outLogger() throws Exception {
List<User> list = new ArrayList<>();
list.add(new User("张三",22));
list.add(new User("李四",45));
list.add(new User("司总",18));
List<User> collect = list.stream().sorted(Comparator.comparing(o -> o.getAge(),Comparator.reverseOrder()))
.collect(Collectors.toList());
collect.forEach(v ->{
System.out.println(v.toString());
});
}
输出:
User(name=李四, age=45)
User(name=张三, age=22)
User(name=司总, age=18)
案例2:Comparator.naturalOrder() 自然排序
@Test
void outLogger() throws Exception {
List<User> list = new ArrayList<>();
list.add(new User("张三",22));
list.add(new User("李四",45));
list.add(new User("司总",18));
List<User> collect = list.stream().sorted(Comparator.comparing(o -> o.getAge(),Comparator.naturalOrder()))
.collect(Collectors.toList());
collect.forEach(v ->{
System.out.println(v.toString());
});
}
输出:
User(name=司总, age=18)
User(name=张三, age=22)
User(name=李四, age=45)
案例3:自定义排序
@Test
void outLogger() throws Exception {
List<User> list = new ArrayList<>();
list.add(new User("张三",22));
list.add(new User("李四",45));
list.add(new User("司总",18));
List<User> collect = list.stream().sorted(Comparator.comparing(o -> o, new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
return o2.getAge() - o1.getAge();
}
})).collect(Collectors.toList());
collect.forEach(v ->{
System.out.println(v.toString());
});
}
输出:
User(name=李四, age=45)
User(name=张三, age=22)
User(name=司总, age=18)
案例4:先按照年龄降序,年龄相同按照money升序排序
@Test
void outLogger() throws Exception {
List<User> list = new ArrayList<>();
list.add(new User("张三",22,100));
list.add(new User("李四",45,200));
list.add(new User("司总",18,999));
list.add(new User("秦总",18,888));
List<User> collect = list.stream().sorted(Comparator.comparing(User::getAge).reversed()
.thenComparing(User::getMoney)).collect(Collectors.toList());
collect.forEach(v ->{
System.out.println(v.toString());
});
}
输出:
User(name=李四, age=45, money=200)
User(name=张三, age=22, money=100)
User(name=秦总, age=18, money=888)
User(name=司总, age=18, money=999)
案例5:先按照年龄降序,年龄相同按照money降序排序
@Test
void outLogger() throws Exception {
List<User> list = new ArrayList<>();
list.add(new User("张三",22,100));
list.add(new User("李四",45,200));
list.add(new User("司总",18,999));
list.add(new User("秦总",18,888));
List<User> collect = list.stream().sorted(Comparator.comparing(User::getAge)
.thenComparing(User::getMoney).reversed()).collect(Collectors.toList());
collect.forEach(v ->{
System.out.println(v.toString());
});
}
输出:
User(name=李四, age=45, money=200)
User(name=张三, age=22, money=100)
User(name=司总, age=18, money=999)
User(name=秦总, age=18, money=888)