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());
}
}
}
可以看到无法正常输出,报错。这里报错的原因是类型转换错误。因为将对象存入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中的对象输出的顺序是按照二叉树的中序进行输出的。
来源:https://www.cnblogs.com/lyd447113735/p/11882895.html


猜你喜欢
- Gradle修改默认的Build配置文件名Gradle默认使用build.gradle作为默认的配置文件文件名。如果我们在build.gra
- 批量添加,批量更新之前判断是否已经存在批量添加之前判断是否已经存在,foreach separator用UNION ALL。批量
- 有时我们在应用中会用到圆形头像,下面是利用CircleImageView实现圆形头像的演示,下面效果和代码,效果如图实现起来也比较简单,先在
- static void Main(string[] args) &nb
- 本文实例为大家分享了Flutter投票组件的使用方法,供大家参考,具体内容如下前景基于公司项目需求,仿照微博实现投票功能。开发遇到的问题1.
- 本文实例为大家分享了java * 实现在线人数统计的具体代码,供大家参考,具体内容如下1.在工程中创建监听类SessionListener
- 很多时候需要先判断当前用户的网络,才会继续之后的一些处理逻辑。但网络类型获取这一块,我用我自己的的手机调试时遇到一些问题,这里记录一下。一加
- 1. Java中导致死锁的原因Java中死锁最简单的情况是,一个线程T1持有锁L1并且申请获得锁L2,而另一个线程T2持有锁L2并且申请获得
- //字符串的内存驻留机制 public static v
- 前言我们知道在Java中除了基础的数据类型以外,其它的都为引用类型。而Java根据其生命周期的长短将引用类型又分为强引用、软引用、弱引用、幻
- #define Testusing System;namespace Wrox.ProCSharp.ParameterTestSample.
- 本文实例讲述了C# Windows API应用之基于FlashWindowEx实现窗口闪烁的方法。分享给大家供大家参考,具体如下:Windo
- 本文主要从两个方面对Android Volley框架的使用方法进行讲解,具体内容如下一、网络请求1.get方式请求数据// 1 创建一个请求
- config.json 文件内容如下{"Data": {"DefaultConnection": {
- 这几天一直都在捣鼓android的知识点,兴趣班的老师,讲课太过深奥,天(想到什么就见什么,后后面完全不想听),最后自己找资料总结了在And
- 启用URL参数在解决方案资源管理器中右键点击你的ClickOnce工程,点击属性进入发布选项卡,点击“选项”按钮,在弹出的界面中选中“允许给
- 本章,会对synchronized关键字进行介绍。涉及到的内容包括:1. synchronized原理2. synchronized基本规则
- 一、简介前面介绍了平时用到的大多数的多线程的例子,但在实际开发中使用的线程往往是大量的和更为复杂的,这时,每次都创建线程、启动线程。从性能上
- 在基于UI元素的自动化测试中, 无论是桌面的UI自动化测试,还是Web的UI自动化测试. 首先我们需要查找和识别UI
- 环境准备项目结构与前文相同:我们添加新的静态资源:因为添加了静态资源,SpringMVC会拦截,所有需要在SpringConfig的配置类中