集合框架之Set TreeSet

Posted luojack

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集合框架之Set TreeSet相关的知识,希望对你有一定的参考价值。

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的主要内容,如果未能解决你的问题,请参考以下文章

Java集合框架 Set接口实现类--TreeSet补充: Comparator接口

java集合Set集合之TreeSet详解

java源码之TreeSet

第七节2:Java集合框架之map和set

java集合系列——Set之HashSet和TreeSet介绍

集合类源码Collection之Set(HashSet, LinkedHashSet, TreeSet)