天天看點

Java基礎-TreeSet與Java自定義類型的排序

示範TreeSet對String是可排序的

TreeSet無法對自定義類型進行排序

比較規則怎麼寫

自平衡二叉樹結構

實作比較器接口

Collections工具類

1.TreeMap集合底層實際上是一個TreeMap

2.TreeMap集合底層是一個二叉樹

3.放到TreeSet集合中的元素,等同于放到TreeMap集合key部分了

4.TreeSet集合中的元素,無序不可重複,但是可以按照元素的大小順序自動排序

稱為:可排序集合

例如:編寫程式從資料庫中取出資料,在頁面展示使用者資訊的時候按照生日升序或者降序,

這個時候可以使用TreeSet集合,因為TreeSet集合放進去,拿出來就是有序的。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

Java基礎-TreeSet與Java自定義類型的排序

TreeSet可以對自定義類型進行排序?

以下程式中,對于Person類來說,無法排序,因為沒有指定Person對象之間的比較規則。誰大誰小并沒有說明。

24

25

26

27

28

29

30

出現這個錯誤的原因是

Person類沒有實作java.lang,Comparable接口

//放在TreeSet集合中的元素需要實作java.lang.Comparable接口

//并且實作compareTo方法,equals可以不寫

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

//需要在這個方法中編寫比較的邏輯,或者說比較的規則,按照什麼進行比較。

//k.compareTo(t.key)

//拿着參數k和集合中的每個k進行比較,傳回值可能是>0,<0,=0

//比較規則最終還是程式員實作的:例如按照年齡升序,或者按照年齡降序

先按照年齡升序,如果年齡一樣的再按照姓名升序

1.自平衡二叉樹,遵循左小右大的原則存放

2.周遊二叉樹的時候有三種方式

前序周遊:根左右

中序周遊:左根右

後序周遊:左右根

注意:前中後說的是根的位置

3.TreeSet集合和TreeMap集合采用的是中序周遊方式,即左根右。他們是自平衡二叉樹

100 200 50 60 80 120 140 130 135 180 666

TreeSet集合中元素可排序的第二種方式,使用比較器的方式

我們可以使用匿名内部類的方式

可以使用匿名内部類的方式(這個類沒有名字,直接new接口)

最終的結論,放在TreeSet或者TreeMap集合key部分的元素要想做到排序,包括兩種方式

第一種:放在集合中的元素實作java.lang.Comparable接口

第二種:在構造TreeSet或者TreeMap集合的時候給它傳一個比較器對象。

Comparable和Comparator怎麼選擇呢?

當比較規則不會發生改變的時候,或者說當比較規則隻有1個的時候,建議實作Comparable接口

如果比較規則有多個,并且需要多個比較規則之間頻繁切換,建議使用comparator接口

comparator接口的設計符合OCP原則。

java.util.Collections集合工具類,友善集合的操作

55

56

57

58

59

60

61

62

Java基礎-TreeSet與Java自定義類型的排序