Java:Comparator 排序问题

在这里插入图片描述
你们也看见上面的这个图了,最近在研究这里面的知识点,涉及到了自己的知识盲区,就是学习学习,可是越发学习,发现越多不懂的知识,今天分享的是 对象的排序问题。


需求
这里提出来一个需求,和简单,就是给对象列表中的对象按照一定的规则排序。

这里给出实体类,定义的是内部类,这里没有修饰符号,不知道大家是否还知道 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 依然适用。


参考文档

猜你喜欢

转载自blog.csdn.net/weixin_41288824/article/details/112550406