根据List对象的属性实现集合的自定义排序,我们主要有两种方式:
一、比较对象实现Comparable接口,利用java.util.Collections.sort(List<T> list)方法实现自定义排序
1.实体类(要比较的对象)
public class User implements Comparable<User>{ private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int compareTo(User o) { int compareTo = this.getName().compareTo(o.getName()); return compareTo; } }
2.测试类
public class Test { public static void main(String[] args) { User u1 = new User(); u1.setId(1L); u1.setName("a"); User u2 = new User(); u2.setId(2L); u2.setName("bb"); User u3 = new User(); u3.setId(3L); u3.setName("ccc"); List<User> list = new ArrayList<>(); list.add(u2); list.add(u1); list.add(u3); for (User user : list) { System.out.println(user.getName()); } System.out.println("*********************"); // 升序 Collections.sort(list); for (User user : list) { System.out.println(user.getName()); } System.out.println("*********************"); // 降序 Collections.reverse(list); for (User user : list) { System.out.println(user.getName()); } } }
3.运行结果
bb a ccc ********************* a bb ccc ********************* ccc bb a
二、自定义比较器,实现Comparator接口,利用java.util.Collections.sort(List<T> list, Comparator<? super T> c)实现自定义排序
1.实体类(要比较的对象,此时不用实现Comparable接口)
public class User{ private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
2.测试类
public class Test { public static void main(String[] args) { User u1 = new User(); u1.setId(1L); u1.setName("a"); User u2 = new User(); u2.setId(2L); u2.setName("bb"); User u3 = new User(); u3.setId(3L); u3.setName("ccc"); List<User> list = new ArrayList<>(); list.add(u2); list.add(u1); list.add(u3); for (User user : list) { System.out.println(user.getName()); } Collections.sort(list, new Comparator<User>() { /* * int compare(User o1, User o2) 返回一个基本类型的整型, * 返回负数表示:o1小于o2 * 返回0 表示:o1和o2相等 * 返回正数表示:o1大于o2 */ @Override public int compare(User o1, User o2) { if (o1.getId() < o2.getId()) { return -1; } if (o1.getId() == o2.getId()) { return 0; } return 1; } }); System.out.println("*********************"); for (User user : list) { System.out.println(user.getName()); } } }
3.运行结果
bb a ccc ********************* a bb ccc
4.测试案例是直接在测试类内部重写compare()方法的;其实还可以专门单独写一个比较器类,在测试类中调用即可。