1. 程式人生 > 其它 >Java:Comparator 排序問題

Java:Comparator 排序問題

技術標籤: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 依然適用。


參考文件