当前位置: 首页 / 技术干货 / 正文
TreeSet集合

2022-12-15

treeset 方法 student ts 集合

  TreeSet集合

  HashSet集合存储的元素是无序的和不可重复的,为了对集合中的元素进行排序,Set接口提供了另一个可以对HashSet集合中元素进行排序的类——TreeSet。

  接下来通过一个案例演示TreeSet集合的用法。

Java
import java.util.TreeSet;

public class demo11 {
    public static void main(String[] args) {
        TreeSet ts = new TreeSet();
        ts.add(3);
        ts.add(1);
        ts.add(1);
        ts.add(2);
        ts.add(3);
        System.out.println(ts);
    }
}

  上述代码中,从打印结果可以看出,添加的元素已经自动排序,并且重复存入的整数1和3只添加了一次。

  TreeSet集合之所以可以对添加的元素进行排序,是因为元素的类可以实现Comparable接口 (基本类型的包装类,String类都实现了该接口),Comparable接口强行对实现它的每个类的对象进行整体排序,这种排序被称为类的自然排序。Comparable接口的compareTo()方法被称为自然比较方法。如果将自定义的Student对象存入TreeSet,TreeSet将不会对添加的元素进行排序,Student对象必须实现Comparable接口并重写compareTo()方法实现对象元素的顺序存取。

  接下来通过一个案例讲解使用compareTo()方法实现对象元素的顺序存取。  

Java
import java.util.TreeSet;

class Student implements Comparable<Student> {
    private String id;
    private String name;

    public Student(String id, String name) {
        this.id = id;
        this.name = name;
    }

    // 重写toString()方法
    @Override
    public String toString() {
        return id + ":" + name;
    }

    @Override
    public int compareTo(Student o) {
        // return 0; // 集合中只有一个元素
        // return 1; // 集合按照怎么存就怎么取
        return -1; // 集合按照存入顺序倒过来进行存储
    }
}

public class Example12 {
    public static void main(String[] args) {
        TreeSet ts = new TreeSet();
        ts.add(new Student("1", "张三"));
        ts.add(new Student("2", "李四"));
        ts.add(new Student("3", "王五"));
        System.out.println(ts);
    }
}

  从运行结果可以看出,TreeSet按照存入元素的顺序倒过来存入了集合中,因为Student类实现了Comparable接口,并重写了compareTo()方法,当compareTo()方法返回0的时候集合中只有一个元素;当compareTo()方法返回正数的时候集合会正常存取;当compareTo()方法返回负数的时候集合会倒序存储。

  上面介绍了TreeSet集合的自然排序,它还有另一种实现排序的方式,即实现Comparator接口,重写compare()方法和equals()方法,但是由于所有的类默认继承Object,而Object中有equals()方法,所以自定义比较器类时,不用重写equals()方法,只需要重写compare()方法,这种排序被称为比较器排序。

  接下来通过一个案例学习将自定义的Student对象通过比较器的方式存入TreeSet集合。  

Java
package com.cy.demo13;
import java.util.Comparator;
import java.util.TreeSet;

class Student {
    private String id;
    private String name;

    public Student(String id, String name) {
        this.id = id;
        this.name = name;
    }

    // 重写toString()方法
    @Override
    public String toString() {
        return id + ":" + name;
    }
}
public class Example13 {
    public static void main(String[] args) {
        TreeSet ts = new TreeSet(new Comparator() {
            @Override
            public int compare(Object o1. Object o2) {
                return -1;
            }
        });
        ts.add(new Student("1", "张三"));
        ts.add(new Student("2", "李四"));
        ts.add(new Student("3", "王五"));
        System.out.println(ts);
    }
}

分享: 更多

上一篇:Set接口简介

下一篇:Map接口与HashMap集合

好程序员公众号

  • · 剖析行业发展趋势
  • · 汇聚企业项目源码

好程序员开班动态

More+
  • HTML5大前端 <高端班>

    开班时间:2021-04-12(深圳)

    开班盛况

    开班时间:2021-05-17(北京)

    开班盛况
  • 大数据+人工智能 <高端班>

    开班时间:2021-03-22(杭州)

    开班盛况

    开班时间:2021-04-26(北京)

    开班盛况
  • JavaEE分布式开发 <高端班>

    开班时间:2021-05-10(北京)

    开班盛况

    开班时间:2021-02-22(北京)

    开班盛况
  • Python人工智能+数据分析 <高端班>

    开班时间:2021-07-12(北京)

    预约报名

    开班时间:2020-09-21(上海)

    开班盛况
  • 云计算开发 <高端班>

    开班时间:2021-07-12(北京)

    预约报名

    开班时间:2019-07-22(北京)

    开班盛况
IT培训IT培训
在线咨询
IT培训IT培训
试听
IT培训IT培训
入学教程
IT培训IT培训
立即报名
IT培训

Copyright 2011-2023 北京千锋互联科技有限公司 .All Right 京ICP备12003911号-5 京公网安备 11010802035720号