你们也看见上面的这个图了,最近在研究这里面的知识点,涉及到了自己的知识盲区,就是学习学习,可是越发学习,发现越多不懂的知识,今天分享的是 对象的排序问题。
需求
这里提出来一个需求,和简单,就是给对象列表中的对象按照一定的规则排序。
这里给出实体类,定义的是内部类,这里没有修饰符号,不知道大家是否还知道 private(类内部),default(类内部,包), protected(类内部,包,子类),public(类内部,包,子类,外部包)
,这些的作用范围。
这里使用的是lombok
的注解,Data(包括一些setter,getter方法),AllargsConstructor(全参构造函数),NoArgsConstructor(无参构造方法)
@Data
@AllArgsConstructor
@NoArgsConstructor
class Employee{
public String name;
public Integer age;
public BigDecimal salary;
}
定义三个Employee的对象,并放在List对象数组里面
// 这里我提一下,你看我使用的是double构建salary,但是没有办法保证数据的准确性,结果就像下面,
// 所以建议使用String来构建,例如e3
Employee e1 = new Employee("李思", 20, new BigDecimal(2001.011) );
Employee e2 = new Employee("Ace", 22, new BigDecimal(2002.012));
Employee e3 = new Employee("jet5devil", 21, new BigDecimal("2003.013"));
List<Employee> employees = Lists.newArrayList();
employees.add(e1);
employees.add(e2);
employees.add(e3);
employees.forEach(System.out::println)-结果
testComparator.Employee(name=李思, age=20, salary=2001.01099999999996725819073617458343505859375)
testComparator.Employee(name=Ace, age=22, salary=2002.011999999999943611328490078449249267578125)
testComparator.Employee(name=jet5devil, age=21, salary=2003.013)
然后就是一系列的排序方式
使用sort实现排序
// one
// sort 对象接收一个comparator函数式接口,可以传入一个lambda函数
// compareTo 比较的是对象类型,例如String,Integer包装类型,BigDecimal 对象
// getName 可以换成你想用什么来排序
employees.sort((o1, o2) -> o1.getName().compareTo(o2.getName()));
employees.forEach(System.out::println);
// two
// 类似的,也可以使用Collections这个集合类的sort方法来实现这个需求
Collections.sort(employees, (o1, o2) -> o1.getAge().compareTo(o2.getAge()));
employees.forEach(System.out::println);
使用Comparator.comparing实现排序
// three
// 使用Comparator.comparing 来实现
employees.sort(Comparator.comparing(Employee::getAge));
employees.forEach(System.out::println);
// four
// 在comparing函数里面,添加了一个自定义的规则
employees.sort(Comparator.comparing(Employee::getAge, (s1, s2)->{
return s2.compareTo(s1);}));
employees.forEach(System.out::println);
// five(实现反序)
// 使用reversed()方法
employees.sort(Comparator.comparing(Employee::getAge).reversed());
employees.forEach(System.out::println);
对于Collections 依然适用。
参考文档