TreeSet子类排序操作 | 带你学《Java语言高级特性》之一百零五

简介: 本节分析了TreeSet子类排序操作和重复元素消除的过程。

上一篇:Set接口 | 带你学《Java语言高级特性》之一百零四
【本节目标】
本节需要掌握分析TreeSet子类排序操作和重复元素消除的过程。

TreeSet子类排序操作

经过分析后发现,TreeSet子类中保存的数据是允许排序的,但是这个类必须要实现Comparable接口,只有实现了此接口才能够确认出对象的大小关系。

提示:TreeSet本质上是利用TreeMap子类实现的集合数据的存储,而TreeMap(树)就需要根据Comparable来确定对象的大小关系。

那么下面就使用一个自定义的类来实现排序的处理操作。
范例:使用自定义的类实现排序的处理操作

import java.util.Set;
import java.util.TreeSet;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Set<Person> all=new TreeSet<Person>();
        all.add(new Person("张三",19));
        all.add(new Person("李四",19));   //年龄相同,但姓名不同
        all.add(new Person("王五",20));   //数据重复
        all.add(new Person("王五",20));   //数据重复
        all.add(new Person("小强",78));
        all.forEach(System.out::println);
    }
}

class Person implements Comparable<Person>{    //比较器
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String toString() {
        return "姓名:" + this.name + "、年龄:" + this.age;
    }
    @Override
    public int compareTo(Person per) {
        if(this.age < per.age){
            return -1 ;
        }else if(this.age > per.age) {
        return 1;
        }else {
            return this.name.compareTo(per.name);
        }
    }
}

/**
* 姓名:张三、年龄:19
* 姓名:李四、年龄:19
* 姓名:王五、年龄:20
* 姓名:小强、年龄:78
*/

在使用自定义类对象进行比较处理的时候,一定要将该类中所有属性都依次进行大小关系的匹配,否则某一个或者几个属性相同的时候也会被认为是重复数据,所以TreeSet是利用了Comparable接口来确认重复数据的。

由于TreeSet在操作过程之中需要将类中的所有属性进行比对,这样的实现难度太高了,那么在实际的开发中应该首选HashSet子类进行存储。

重复元素消除

TreeSet类是利用了Comparable接口来实现了重复元素的判断,但是Set集合的整体特征就是不允许保存重复元素。但是HashSet判断重复元素的方式并不是利用Comparable接口完成的,它利用的是Object类中提供的方法实现的:

  • 对象编码:public int hashCode();
  • 对象比较:public boolean equals​(Object obj);

在进行重复元素判断的时候首先利用hashCode()进行编码的匹配,如果该编码不存在,则表示数据不存在,证明没有重复,如果该编码存在,则进一步进行对象比较处理,如果发现重复了,则此数据是不允许保存的。如果使用的是Eclipse开发工具,则可以帮助开发者自动创建HashCode()与equals()方法。
image.png
image.png

范例:实现重复元素处理

import java.util.Set;
import java.util.HashSet;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Set<Person> all=new TreeSet<Person>();
        all.add(new Person("张三",19));
        all.add(new Person("李四",19));   //年龄相同,但姓名不同
        all.add(new Person("王五",20));   //数据重复
        all.add(new Person("王五",20));   //数据重复
        all.add(new Person("小强",78));
        all.forEach(System.out::println);
    }
}

class Person implements Comparable<Person>{    //比较器
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result +age;
        result = prime * result + ((name == null)? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        }else if (!name.equals(other.name))
            return false;
        return true;
    }

    public String toString() {
        return "姓名:" + this.name + "、年龄:" + this.age;
    }
    @Override
    public int compareTo(Person per) {
        if(this.age < per.age){
            return -1 ;
        }else if(this.age > per.age) {
        return 1;
        }else {
            return this.name.compareTo(per.name);
        }
    }
}

/**
* 姓名:小强、年龄:78
* 姓名:李四、年龄:19
* 姓名:王五、年龄:20
* 姓名:张三、年龄:19
*/

在Java程序中,真正的重复元素的判断处理利用的就是hashCode和equals()两个方法共同作用完成的,而只有在排序要求的情况下(TreeSet)才会利用Comparable接口来实现。

想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:集合输出 | 带你学《Java语言高级特性》之一百零六
更多Java面向对象编程文章查看此处

相关文章
|
7天前
|
分布式计算 DataWorks Java
DataWorks操作报错合集之在使用MaxCompute的Java SDK创建函数时,出现找不到文件资源的情况,是BUG吗
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
24 0
|
12天前
|
安全 Java 大数据
探索Java的奇妙世界:语言特性与实际应用
探索Java的奇妙世界:语言特性与实际应用
|
7天前
|
Java 测试技术 Python
《手把手教你》系列技巧篇(三十六)-java+ selenium自动化测试-单选和多选按钮操作-番外篇(详解教程)
【4月更文挑战第28天】本文简要介绍了自动化测试的实战应用,通过一个在线问卷调查(&lt;https://www.sojump.com/m/2792226.aspx/&gt;)为例,展示了如何遍历并点击问卷中的选项。测试思路包括找到单选和多选按钮的共性以定位元素,然后使用for循环进行点击操作。代码设计方面,提供了Java+Selenium的示例代码,通过WebDriver实现自动答题。运行代码后,可以看到控制台输出和浏览器的相应动作。文章最后做了简单的小结,强调了本次实践是对之前单选多选操作的巩固。
22 0
|
20小时前
|
传感器 人工智能 前端开发
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
智慧校园电子班牌,坐落于班级的门口,适合于各类型学校的场景应用,班级学校日常内容更新可由班级自行管理,也可由学校统一管理。让我们一起看看,电子班牌有哪些功能呢?
34 4
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
|
23小时前
|
网络协议 Java 数据库连接
Java语言的特点
【5月更文挑战第7天】Java是一种面向对象的编程语言,强调数据和操作的封装,具备平台独立性,能“一次编写,到处运行”。它有自动垃圾收集机制,消除手动内存管理。Java是强类型语言,注重安全性,并支持多线程编程。其丰富的API库和对网络编程的良好支持增强了功能。此外,Java的可扩展性使其能轻松适应新需求和扩展。
11 4
|
23小时前
|
分布式计算 Java 大数据
Java语言主要应用领域
【5月更文挑战第7天】Java在嵌入式系统中以低至130KB的占用展现可靠性,实现“一次编写,到处运行”。在大数据领域,Java通过Hadoop、Hbase、Accumulo和ElasticSearch等工具发挥关键作用。Java也是Eclipse、IntelliJ IDEA和NetBeans等开发工具的基础。广泛应用于电商网站和金融服务器系统,即便在J2ME式微后,仍能在部分低端手机中找到其踪影。
10 4
|
1天前
|
搜索推荐 Java Shell
8大Java排序方法(由简入繁),有代码详解和原理指导
8大Java排序方法(由简入繁),有代码详解和原理指导
10 0
|
5天前
|
XML 前端开发 Oracle
16:JSP简介、注释与Scriptlet、Page指令元素、Include操作、内置对象、四种属性-Java Web
16:JSP简介、注释与Scriptlet、Page指令元素、Include操作、内置对象、四种属性-Java Web
10 2
|
7天前
|
存储 NoSQL 安全
java 中通过 Lettuce 来操作 Redis
java 中通过 Lettuce 来操作 Redis
java 中通过 Lettuce 来操作 Redis
|
8天前
|
分布式计算 DataWorks 监控
DataWorks操作报错合集之DataWorks在调用java sdk的createFile功能时报错com.aliyuncs.exceptions.ClientException: 1201111000 如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
10 1