集合框架之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);

    }

}

原文地址:https://www.cnblogs.com/luojack/p/10817272.html

时间: 2024-10-25 23:38:48

集合框架之Set TreeSet的相关文章

Java集合框架总结(3)——TreeSet类的排序问题

Java集合框架总结(3)--TreeSet类的排序问题 TreeSet支持两种排序方法:自然排序和定制排序.TreeSet默认采用自然排序. 1.自然排序 TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间大小关系,然后将集合元素按升序排列,这种方式就是自然排序.(比较的前提:两个对象的类型相同). java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现该接口的类必须实现该

黑马程序员-Java基础-集合框架-TreeSet、二叉树、泛型

第一讲 TreeSet 1.  概述 TreeSet可以对Set集合中的元素进行排序,按照自然顺序排. 2.  演示代码 输出结果: 总结:TreeSet会对元素进行自然排序,大写排在小写前面. 第二讲  TreeSet存储自定义对象 1. 概述: 将自定义对象存储到TreeSet集合中. 2. 思路: 自定义学生类,并将学生对象存储到TreeSet中,在存储过程中按照年龄排序. 3. 练习:往TreeSet集合中存储自定义对象(学生),并按照学生年龄进行排序 小结: 自定义对象需要重写Comp

【Java_集合框架Set】HashSet、LinkedHashSet、TreeSet使用区别

HashSet:哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放: LinkedHashSet:以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代: TreeSet:提供一个使用树结构存储Set接口的实现,对象以升序顺序存储,访问和遍历的时间很快. 示例代码:: 1 package com.test2; 2 3 import java.util.HashSet; 4 import java.util.Iterator; 5 import java.uti

[javaSE] 集合框架(TreeSet)

TreeSet:可以对Set集合中的元素排序,默认按照ascii表排序,二叉树结构 左边叉是小的,右边叉是大的 存储自定义对象 定义一个类Student实现Comparable类,使自定义类具备比较性 定义属性年龄age 定义属性姓名name 实现compareTo()方法,传递进来另一个Student对象 判断当前Student对象的age大于另一个Student对象的age,返回1,否则返回-1 获取Student对对象 调用TreeSet对象的add()方法,参数:Student对象 遍历

《深入理解Java集合框架》系列文章

Introduction 关于C++标准模板库(Standard Template Library, STL)的书籍和资料有很多,关于Java集合框架(Java Collections Framework, JCF)的资料却很少,甚至很难找到一本专门介绍它的书籍,这给Java学习者们带来不小的麻烦.我深深的不解其中的原因.虽然JCF设计参考了STL,但其定位不是Java版的STL,而是要实现一个精简紧凑的容器框架,对STL的介绍自然不能替代对JCF的介绍. 本系列文章主要从数据结构和算法层面分析

JAVA集合框架

收藏 查看我的收藏 146有用+1 56 编辑 Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称.用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台.动态的Web.Internet计算.从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现在均支持Java applet.集合框架是为表示和操作集合而规定的一种统一的标准的体系结构.任何集合框架都包含三大块内容:对外的接口.接口的实

我所理解Java集合框架的部分的使用(Collection和Map)

所谓集合,就是和数组类似--一组数据.java中提供了一些处理集合数据的类和接口,以供我们使用. 由于数组的长度固定,处理不定数量的数据比较麻烦,于是就有了集合. 以下是java集合框架(短虚线表示接口,长虚线表示抽象类,实线表示类,箭头表示实现接口或者继承)(在网络上找的图,不知道原作者,侵权请联系我删除)(总之,关系很复杂,所以不用记得这个图,只是用来吓吓人而已的). 下面贴上个人理解之精简版之Collection(集)和Map(地图?暂且这么理解吧),话说思维导图蛮好用,以下是两幅思维导图

【Java集合源码剖析】Java集合框架

Java集合工具包位于package java.util下.包含了一些常用的数据结构,如数组.链表(单/双向).树.栈.队列.哈希表等. Java集合框架大致可分为五部分:List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Arrays.Collections). Java集合类的整体框架如下: 如图,Java集合类大致分为两大类:Collection和Map. Collection主要包括两部分:List和Set. List接口通常表示一个列表(数

8. 集合框架:★★★★★

集合框架:★★★★★,用于存储数据的容器. 特点: 1:对象封装数据,对象多了也需要存储.集合用于存储对象. 2:对象的个数确定可以使用数组,但是不确定怎么办?可以用集合.因为集合是可变长度的. 集合和数组的区别: 1:数组是固定长度的:集合可变长度的. 2:数组可以存储基本数据类型,也可以存储引用数据类型:集合只能存储引用数据类型. 3:数组存储的元素必须是同一个数据类型:集合存储的对象可以是不同数据类型.   数据结构:就是容器中存储数据的方式. 对于集合容器,有很多种.因为每一个容器的自身