Java:Comparator 排序問題
阿新 • • 發佈:2021-01-13
技術標籤:java知識點comparator物件排序java8
你們也看見上面的這個圖了,最近在研究這裡面的知識點,涉及到了自己的知識盲區,就是學習學習,可是越發學習,發現越多不懂的知識,今天分享的是 物件的排序問題。
需求
這裡提出來一個需求,和簡單,就是給物件列表中的物件按照一定的規則排序。
這裡給出實體類,定義的是內部類,這裡沒有修飾符號,不知道大家是否還知道 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 依然適用。
參考文件