1. 程式人生 > >Comparable接口的compareTo()方法

Comparable接口的compareTo()方法

test 方法 log treeset pan pri 實現 節點 color

【代碼】

 1 package com.hxl;
 2 
 3 public class Student implements Comparable<Student> {
 4 
 5     private String name;
 6     private int age;
 7 
 8     public Student() {
 9         super();
10     }
11 
12     public Student(String name, int age) {
13         super();
14         this.name = name;
15 this.age = age; 16 } 17 18 public String getName() { 19 return name; 20 } 21 22 public void setName(String name) { 23 this.name = name; 24 } 25 26 public int getAge() { 27 return age; 28 } 29 30 public void setAge(int age) { 31 this
.age = age; 32 } 33 34 @Override 35 public int compareTo(Student s) { 36 // 先讓兩個對象的age屬性做差比較,這個是主要排序條件 37 int num = this.age - s.age; 38 // 若age屬性相同,再比較name屬性(String類本身實現了Comparable接口) 39 // 即在主要排序條件相同的情況下,次要排序條件起作用 40 int flag = num == 0 ? this.name.compareTo(s.name) : num;
41 // 返回比較結果 42 return flag; 43 } 44 }
 1 package com.hxl;
 2 
 3 import java.util.TreeSet;
 4 
 5 public class Test {
 6     public static void main(String[] args) {
 7         TreeSet<Student> ts = new TreeSet<Student>();
 8         ts.add(new Student("cc", 11));
 9         ts.add(new Student("ee", 11));
10         ts.add(new Student("cc", 22));
11         ts.add(new Student("aa", 22));
12         ts.add(new Student("bb", 11));
13 
14         for (Student s : ts) {
15             System.out.println(s.getName()+"_"+s.getAge());
16         }
17 
18         /*
19             為什麽TreeSet集合中的元素既唯一又有序呢?
20             原因是它在存儲元素的時候就是有序存儲的(紅黑樹結構存儲)
21             TreeSet的add()方法底層依賴的是Comparable的compareTo方法
22             這裏就是說元素類本身要有自己的compareTo方法
23             所以元素類本身必須實現Comparable接口,重寫compareTo方法
24             compareTo方法有個特點:它返回的是int型數據,結果有三類負數、0、正數
25             例如:(Java中一些常見的有比較意義的一些類都實現了Comparable接口,如Integer類)
26                 Integer a = new Integer(10);
27                 Integer b = new Integer(20);
28                 int num = a.compareTo(b);     //因為a小於b,所以num返回的是負數
29             而TreeSet的add()方法這樣理解此返回值:
30             即返回負數則比根節點小,元素在此集合中唯一,元素存放根的左孩子
31             返回正數則比根節點大,元素在此集合中唯一,元素存放根的右孩子
32             返回0則表示,元素相同,在此集合中不唯一,故而丟掉不存放
33             由此可見,我們的重寫的compareTo()方法決定了TreeSet集合中元素的去留和順序!
34         */
35     }
36 }

Comparable接口的compareTo()方法