Java中TreeSet、HashSet、Collection重写比较器的实现

 更新时间:2023年08月10日 10:42:59   作者:高垚淼  
比较器是一种可以对集合或数组中的元素按照自定义的方式进行排序的对象,本文主要介绍了Java中TreeSet、HashSet、Collection重写比较器的实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

一、什么是比较器?

比较器是一种可以对集合或数组中的元素按照自定义的方式进行排序的对象,它是实现了Comparator接口的类的实例,可以决定元素在集合或映射中如何被排序和存储。

比较器有两种基本类型:自然排序和定制排序。自然排序是指让要排序的类实现Comparable接口,并重写compareTo方法,来定义元素的默认排序方式。定制排序是指创建一个实现了Comparator接口的类,并重写compare方法,来定义元素的特定排序方式。定制排序可以覆盖自然排序,也可以在自然排序不适用的情况下使用。

二、TreeSet为什么重写比较器?

TreeSet是一个有序的集合,它可以按照自然排序或者定制排序来排列元素。自然排序是指让要排序的类实现Comparable接口,并重写compareTo方法,来定义元素的默认排序方式。定制排序是指创建一个实现了Comparator接口的类,并重写compare方法,来定义元素的特定排序方式。

TreeSet实现了Set接口,可以去重内容相同的元素。比如存入Integer类型的两个数据,6和6,遍历输出,只会输出一个6。但是对于自定义类,添加进TreeSet排序,会报错,因为比较器无法比较一个类。因此我们重写比较器,按照类中的指定属性进行排序

代码展示:

直接使用这个模板也是可以的,根据什么排序,就使用什么来做减法。等于0时会去重,正数会从小到大排序,负数会从大到小排序。

// 创建一个按照年龄升序排列的TreeSet
TreeSet<Person> ts = new TreeSet<>(new Comparator<Person>() {
    @Override
    public int compare(Person p1, Person p2) {
        return p1.getAge() - p2.getAge();
    }
});

三、HashSet为什么重写比较器?

HashSet是一个无序的集合,它不保证元素的排列顺序,并且不允许重复元素。HashSet是基于哈希表实现的,它通过调用元素的hashCode和equals方法来判断元素是否相等和决定元素在哈希表中的位置。

当我们添加进HashSet中相同属性的两个类,想去重时,可以选择重写hashcode方法和equal方法。(HashSet的比较器底层实现通过hashcode和equal,两个返回值都为true时,才会去重)

代码展示:

// 定义一个Person类,并重写hashCode和equals方法
class Person {
    private String name;
    private int age;

    // 省略构造方法和get/set方法

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Person person = (Person) obj;
        return age == person.age && Objects.equals(name, person.name);
    }
}

// 创建一个HashSet对象,并添加Person对象
HashSet<Person> hs = new HashSet<>();
hs.add(new Person("张三", 20));
hs.add(new Person("李四", 21));
hs.add(new Person("张三", 20)); // 这个对象不会被添加,因为和第一个对象相等

四、Collection为什么重写比较器?

Collection是一个接口,它是Java集合框架的根接口,它定义了一些通用的操作方法,如添加、删除、遍历、排序等。Collection接口有很多实现类,如ArrayList、LinkedList、HashSet、TreeSet等。Collection接口本身并不需要重写比较器,但是它提供了一个sort方法,可以对实现了List接口的集合进行排序。该方法有两个重载形式,一个是使用自然排序,另一个是使用定制排序。

当我们想对ArryList集合进行排序时(ArryList本身无法排序,没有比较器),可以通过重写比较器来进行排序。

// 创建一个ArrayList对象,并添加一些字符串
ArrayList<String> al = new ArrayList<>();
al.add("apple");
al.add("banana");
al.add("orange");
al.add("pear");

// 使用自然排序对ArrayList进行排序
Collections.sort(al);

// 使用定制排序对ArrayList进行排序,按照字符串长度升序排列
Collections.sort(al, (s1, s2) -> s1.length() - s2.length());

到此这篇关于Java中TreeSet、HashSet、Collection重写比较器的实现的文章就介绍到这了,更多相关Java 重写比较器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • 使用Spring Batch实现大数据处理的操作方法

    使用Spring Batch实现大数据处理的操作方法

    通过使用Spring Batch,我们可以高效地处理大规模数据,本文介绍了如何配置和实现一个基本的Spring Batch作业,包括读取数据、处理数据和写入数据的全过程,感兴趣的朋友跟随小编一起看看吧
    2024-07-07
  • Java 自定义注解在登录验证的应用示例

    Java 自定义注解在登录验证的应用示例

    本文主要介绍了Java 自定义注解在登录验证的应用示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • SpringBoot集成内存数据库H2的实践

    SpringBoot集成内存数据库H2的实践

    h2是内存数据库,查询高效,可以在开发初期使用它。本文主要介绍了SpringBoot集成内存数据库H2的实践,具有一定的参考价值,感兴趣的可以了解一下
    2021-09-09
  • 使用Spring AOP实现MySQL数据库读写分离案例分析(附demo)

    使用Spring AOP实现MySQL数据库读写分离案例分析(附demo)

    分布式环境下数据库的读写分离策略是解决数据库读写性能瓶颈的一个关键解决方案,这篇文章主要介绍了使用Spring AOP实现MySQL数据库读写分离案例分析(附demo),有兴趣的可以了解一下。
    2017-01-01
  • JAVA返回PDF文件流并进行下载的实现方法

    JAVA返回PDF文件流并进行下载的实现方法

    这篇文章主要给大家介绍了关于JAVA返回PDF文件流并进行下载的实现方法,PDF文件流下载是通过HTTP协议将服务器上的PDF文件以流的方式发送给客户端,供客户端保存到本地磁盘或直接在浏览器中打开,需要的朋友可以参考下
    2024-02-02
  • JAVA异常体系结构详解

    JAVA异常体系结构详解

    Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类,下面通过本文给大家分享JAVA异常体系结构,感兴趣的朋友一起看看吧
    2017-11-11
  • Springboot2.0处理自定义异常并返回json

    Springboot2.0处理自定义异常并返回json

    这篇文章主要介绍了Springboot2.0处理自定义异常并返回json,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • MyBatis-Plus拦截器实现数据权限控制的方法

    MyBatis-Plus拦截器实现数据权限控制的方法

    MyBatis-Plus是一款基于MyBatis的增强工具,它提供了一些便捷的功能和增强的查询能力,数据权限控制是在系统中对用户访问数据进行限制的一种机制,这篇文章主要给大家介绍了关于MyBatis-Plus拦截器实现数据权限控制的相关资料,需要的朋友可以参考下
    2024-01-01
  • Java如何获取resources下的文件路径和创建临时文件

    Java如何获取resources下的文件路径和创建临时文件

    这篇文章主要介绍了Java如何获取resources下的文件路径和创建临时文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Java利用POI读取、写入Excel的方法指南

    Java利用POI读取、写入Excel的方法指南

    这篇文章主要给大家介绍了关于Java利用POI读取、写入Excel的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03

最新评论