Java TreeSet类的简单理解和使用

 更新时间:2020年02月05日 12:17:06   作者:西红柿里没有番茄  
这篇文章主要介绍了Java TreeSet类的简单理解和使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了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;<br data-filtered="filtered">     return 1;<br data-filtered="filtered">     return -1;<br data-filtered="filtered">
  }

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • IDEA Error:java:无效的源发行版:13的解决过程

    IDEA Error:java:无效的源发行版:13的解决过程

    之前用idea运行时,也会出现这种情况,后面通过网上的资料解决了这个问题,下面这篇文章主要给大家介绍了关于IDEA Error:java:无效的源发行版:13的解决过程,需要的朋友可以参考下
    2023-01-01
  • java利用CompletionService保证任务先完成先获取到执行结果

    java利用CompletionService保证任务先完成先获取到执行结果

    这篇文章主要为大家详细介绍了java如何利用CompletionService来保证任务先完成先获取到执行结果,文中的示例代码讲解详细,需要的可以参考下
    2023-08-08
  • Java 中不全部使用 Static 方法的理由

    Java 中不全部使用 Static 方法的理由

    这篇文章主要介绍了Java 中不全部使用 Static 方法的理由,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • SpringMVC结合ajaxfileupload.js实现文件无刷新上传

    SpringMVC结合ajaxfileupload.js实现文件无刷新上传

    这篇文章主要介绍了SpringMVC结合ajaxfileupload.js实现文件无刷新上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 详解mybatis三种分页方式

    详解mybatis三种分页方式

    本文主要介绍了详解mybatis三种分页方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Java网络编程UDP实现消息发送及聊天

    Java网络编程UDP实现消息发送及聊天

    这篇文章主要为大家详细介绍了Java网络编程UDP实现消息发送及聊天,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • xxl-job 带参数执行和高可用部署方法

    xxl-job 带参数执行和高可用部署方法

    这篇文章主要介绍了xxl-job 带参数执行和高可用部署,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • Java 添加和删除PDF图层的示例代码

    Java 添加和删除PDF图层的示例代码

    本文将介绍如何使用Spire.PDF for Java来添加和删除PDF图层,本文通过示例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-02-02
  • Eclipse智能提示及快捷键

    Eclipse智能提示及快捷键

    本文主要介绍了Eclipse智能提示及快捷键的相关知识,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • 解决SpringBoot的@DeleteMapping注解的方法不被调用问题

    解决SpringBoot的@DeleteMapping注解的方法不被调用问题

    这篇文章主要介绍了解决SpringBoot的@DeleteMapping注解的方法不被调用问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01

最新评论