1. 程式人生 > >集合框架之Set TreeSet

集合框架之Set TreeSet

compare tree ngs 通過 pareto size @override strong 否則

TreeSet是Set接口的實現類,底層數據結構是二叉樹。

TreeSet的存儲方式按照一定的規則。存儲規則讓數據表現出自然順序。

    TreeSet(二叉樹)工作原理

        技術分享圖片

      添加一個新元素t的存儲步驟:

    

[1] 如果集合無元素,t直接加入;如果集合有元素,t和根節點比較;

[2] 如果t小於根節點;把t放到根節點的左子樹上;重復1-3步驟

[3] t大於根節點;把t放到根節點的右子樹上;重復1-3步驟

輸出時按照一定的規則:左子樹->根節點->右子樹

根據TreeSet的工作原理,向TreeSet添加自定義元素?

向TreeSet中添加元素時,一定要提供比較策略,否則會出現ClassCastException。

比較策略分為兩種: 內部比較器和外部比較器。

      內部比較器:

  在自定義對象,實現comparable接口,並實現compareTo方法。通過指定的方法策略,完成對象元素比較,再進行存儲。

 比較方法1:

 1 public class Student implements Comparable<Student> {
 2     private int id;
 3     private String name;
 4     private
int age; 5 6 public int getId() { 7 return id; 8 } 9 10 public void setId(int id) { 11 this.id = id; 12 } 13 14 public String getName() { 15 return name; 16 } 17 18 public void setName(String name) { 19 this.name = name;
20 } 21 22 public int getAge() { 23 return age; 24 } 25 26 public void setAge(int age) { 27 this.age = age; 28 } 29 30 @Override 31 public int compareTo(Student o) { 32 if(this.getAge()<o.getAge()){ 33 return -1; //-1表示升序排序 34 }else if(this.getAge()==o.getAge()){ 35 return 0; //0表示不添加存儲 36 }else { 37 return 1;  //1表示降序 38 } 39 40 } 41 42 43 }

比較方法2:

public class Student implements Comparable<Student> {
    private int id;
    private String name;
    private int age;
    
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public int compareTo(Student o) {
        /*return this.getAge()-o.getAge(); //升序  */
        
        return o.getAge()-this.getAge();//降序                        
    }    
}

比較方法3: 當年齡相等的時候,比較其他屬性。

 1 public class Student implements Comparable<Student> {
 2     private int id;
 3     private String name;
 4     private int age;
 5     
 6     public int getId() {
 7         return id;
 8     }
 9 
10     public void setId(int id) {
11         this.id = id;
12     }
13 
14     public String getName() {
15         return name;
16     }
17 
18     public void setName(String name) {
19         this.name = name;
20     }
21 
22     public int getAge() {
23         return age;
24     }
25 
26     public void setAge(int age) {
27         this.age = age;
28     }
29 
30     @Override
31     public int compareTo(Student o) {
32             if(this.getAge()<o.getAge()){
33                 return -1;
34             }else if(this.getAge()== o.getAge()){
35                 return this.getName().compareTo(o.getName());
36             }else{
37                 return 1;
38             }
39             
40     }    
41 }

    外部比較器:

    當實際開發過程中,不知道添加元素的源代碼,無權修改別人的代碼,此時可以使用外部比較器。

  比較方法1:使用外部類

 1 public class Day1 {
 2 
 3     public static void main(String[] args) {
 4         LanComparator lanComparator=new LanComparator();
 5         TreeSet<String> set=new TreeSet<String>();
 6         set.add("zhangsan");
 7         set.add("lisi");
 8         set.add("wangwu");
 9         
10         set.add("lisi");
11         System.out.println(set);
12                     
13     }
14     
15 }
16 class LanComparator implements Comparator<String>{
17 
18     @Override
19     public int compare(String o1, String o2) {    
20         
21         return o1.length()-o2.length();
22     }
23     
24 }

  比較方法2: 使用匿名內部類

public class Day1 {

    public static void main(String[] args) {
        /*LanComparator lanComparator=new LanComparator();*/
        TreeSet<String> set=new TreeSet<String>(new Comparator<String>() {

            @Override
            public int compare(String o1, String o2) {
                
                return o1.length()-o2.length();
            }
            
        });
        set.add("zhangsan");
        set.add("lisi");
        set.add("wangwu");
        
        set.add("lisi");
        System.out.println(set);
                    
    }
    
}

集合框架之Set TreeSet