zoukankan      html  css  js  c++  java
  • java中TreeSet类的简单理解和使用

      TreeSet类是Set接口的一个实现类,主要作用是用于对对象的排序以及确定存入对象的唯一性。给对象排序的方式有很多,比如一些基本类型int、String等类型就已经提供了很多排序的方法了,但是这并不说明TreeSet类就没有什么用了。在一些时候我们需要自定义一些类,同时需要对这个类的对象进行排序,那么这个时候我们就可以通过这个TreeSet类去自定义一个排序的条件。

    现在通过一个简单的案例实现来实现这个排序和唯一性

    首先自定义一个Student类,类里面有三个属性,分别是姓名、学号、年龄

    public class Student{
    
    
        private String name;
        private String num;
        private int age;
    
    
        Student(String name, String num, int age) {
            this.name = name;
            this.num = num;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getNum() {
            return num;
        }
    
        public void setNum(String num) {
            this.num = num;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
    
    }
    

      

    然后我们给这个类的三个属性添加值,并且将类的实例化对象添加到TreeSet类中。

    注意:TreeSet类是没有get方法的,要输出里面的内容得通过foreach循环或者迭代器输出,如果直接通过print进行输出,显示的是内存地址对象。

    import java.util.Iterator;
    import java.util.Set;
    
    public class TreeSet {
    
        public static void main(String[] args) {
    
    
            Student s1 = new Student("张珊", "111213", 18);
            Student s2 = new Student("隔壁", "111215", 19);
            Student s3 = new Student("翠花", "111214", 12);
            Student s4 = new Student("老王", "111212", 11);
            Student s5 = new Student("老黑", "111212", 11);
    
    
            Set set = new java.util.TreeSet();
    
            set.add(s1);
            set.add(s2);
            set.add(s3);
            set.add(s4);
            set.add(s5);
    
    //      通过迭代器输出结果
            Iterator iterator = set.iterator();
            while (iterator.hasNext()) {
                Student o = (Student) iterator.next();
                System.out.println(o.getName());
    
            }
    
    
        }
    
    
    }

    然后我们来看下输出结果

    可以看到无法正常输出,报错。这里报错的原因是类型转换错误。因为将对象存入TreeSet类中时需要对对象进行一个比较,第一次存入时因为没有可对比的对象,所以不会报错,但是当第二个对象存入时需要同第一个对象进行比较,再决定在二叉树中存放的位置。这里的比较方法需要我们自己去实现Comparable<>接口重写一个compareTo()方法。

    那么现在在自定义Student类中实现Comparable并且重现compareTo()方法

    public class Student implements Comparable<Student>{
    
    
        private String name;
        private String num;
        private int age;
    
    
        Student(String name, String num, int age) {
            this.name = name;
            this.num = num;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getNum() {
            return num;
        }
    
        public void setNum(String num) {
            this.num = num;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
    
    
        @Override
        public int compareTo(Student o) {
    //通过年龄的比较确定存放顺序
            return this.age-o.age;
        }
    }
    

      

    现在看下输出结果

    可以看到存入的内容可以正常输出的了,但是老黑没有输出,这是因为老黑和老王的年龄相同,而我们重写的compareTo()方法中的比较条件就是年龄。下面来看看这个方法中的返回值的含义。

    @Override
        public int compareTo(Student o) {
    
            return 0;
         return 1;
         return -1;
    }

      

    compareTo()方法的返回值类型是int类型,在这里只存在三种情况,分别是:大于0,小于0,和等于0。

    TreeSet的底层结构是一个二叉树,每次插入的对象都会根据二叉树的结构进行排列。当前后两个对象的条件进行比较返回正数时,后一个对象会存在已前一个对象为根的右节点;当前后两个对象的条件进行比较返回负数时,后一个对象会存在已前一个对象为根的左节点;当前后两个对象的条件进行比较返回0时,后一个对象不存入TreeSet中。因为老黑和老王年龄相同,所以这里名字为老黑的对象就不存入了。

    存入TreeSet中的对象输出的顺序是按照二叉树的中序进行输出的。

  • 相关阅读:
    Semaphore
    财报分析
    关于C#中的new的用法
    Linux(CentOS)下Postgresql数据库的安装配置
    CentOS下实现SCP免输密码传送文件
    HiveQL逻辑执行顺序
    CentOS上以源码的方式安装Redis笔记
    Python学习心得(七) 深入理解threading多线程模块
    SQL Server返回两个Date日期相差共多少天零多少小时零多少分钟零多少秒
    Python学习心得(六) 反射机制、装饰器
  • 原文地址:https://www.cnblogs.com/lyd447113735/p/11882895.html
Copyright © 2011-2022 走看看