Java TreeSet类的简单理解和使用

作者:西红柿里没有番茄 时间:2023-01-02 18:32:27 

这篇文章主要介绍了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());

}

}

}

Java TreeSet类的简单理解和使用

可以看到无法正常输出,报错。这里报错的原因是类型转换错误。因为将对象存入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;
 }
}

现在看下输出结果

Java TreeSet类的简单理解和使用

可以看到存入的内容可以正常输出的了,但是老黑没有输出,这是因为老黑和老王的年龄相同,而我们重写的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中的对象输出的顺序是按照二叉树的中序进行输出的。

来源:https://www.cnblogs.com/lyd447113735/p/11882895.html

标签:java,TreeSet,类
0
投稿

猜你喜欢

  • SpringBoot全局Controller返回值格式统一

    2022-09-12 14:07:52
  • Java详细分析String类与StringBuffer和StringBuilder的使用方法

    2022-04-23 15:23:30
  • Android仿今日头条顶部导航栏效果的实例代码

    2022-04-02 23:18:03
  • Java equals 方法与hashcode 方法的深入解析

    2022-03-05 19:20:15
  • 使用C#编写简单的图形化的可发送附件的邮件客户端程序

    2023-04-24 22:42:04
  • java学习之利用TCP实现的简单聊天示例代码

    2021-07-13 00:43:18
  • 详解C++ STL模拟实现forward_list

    2023-06-21 02:36:04
  • android初学者必须掌握的Activity状态的四大知识点(必读)

    2022-08-31 13:26:31
  • 在IntelliJ IDEA中为自己设计的类库生成JavaDoc的方法示例

    2023-11-25 09:49:02
  • idea 实现搜索jdk中的类和包操作

    2022-06-02 22:54:47
  • Java内存区域与内存溢出异常详解

    2022-09-10 17:01:19
  • 深入理解Spring中bean的生命周期介绍

    2023-02-08 17:21:37
  • Java事件处理步骤讲解

    2023-10-14 11:49:57
  • Flutter源码分析之自定义控件(RenderBox)指南

    2022-09-08 21:17:28
  • Kotlin 基础教程之异常

    2022-10-31 06:34:52
  • RxJava+Retrofit实现网络请求封装的方法

    2023-08-13 19:39:13
  • SpringBoot 二维码生成base64并上传OSS的实现示例

    2023-05-12 04:41:33
  • Spring Cloud下OAUTH2注销的实现示例

    2023-06-01 22:54:58
  • 详解idea maven nexus 常见命令配置

    2021-06-07 18:29:03
  • Java swing框架实现的贪吃蛇游戏完整示例

    2021-06-30 13:03:01
  • asp之家 软件编程 m.aspxhome.com