JAVA中TreeSet集合的两种排序方法:自然排序和比较器排序

TreeSet支持2种排序:自然排序、比较器排序。

由于TreeSet对内部元素的排序的方法有2种:自然顺序排序、比较器排序。 所以,如果TreeSet采用自然顺序排序,需要内部的元素(即自定义类型)实现Comparable接口。 如果TreeSet采用比较器排序,需要提供比较器对象。

自然排序:被放入TreeSet的数据,必须实现Comparable接口。Comparable接口中只有一个方法compareTo(T t) ,即被放入TreeSet中的对象要实现compareTo方法,TreeSet每放入一个元素,就会拿这个元素和已有元素比较(用compareTo方法比较),最终确定新添加的数据的位置,使TreeSet集合所有元素有序。

比较器排序:这种排序方式更加灵活,不要求容器中的元素实现Comparable接口。而是通过一个实现了Comparator接口的类来对TreeSet中的元素进行排序。Comparator实现类必须要实现 compare(Tt1, T t2)方法。TreeSet中每放入一个元素,就会借助比较器比较新加入的元素和已有元素的大小关系,最终确定新添加的数据的位置,使TreeSet集合所有元素有序。

 自然排序

创建一个Teacher类,做自然排序.

public class Teacher implements Comparable<Teacher>{
    private int age;
    private String name;
    private int salary;

    public Teacher() {
    }

    public Teacher(int age, String name, int salary) {
        this.age = age;
        this.name = name;
        this.salary = salary;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", salary=" + salary +
                '}';
    }

    @Override
    public int compareTo(Teacher o) {
        //年龄升序,如果年龄相等按工资降序
        if (this.age-o.age!=0){
            return this.getAge()-o.getAge();
        }else {
            return o.salary-this.salary;
        }

    }
}

 比较器排序

创建一个Teacher1,做比较器排序.

public class Teacher1 {
    private int age;
    private String name;
    private int salary;

    public Teacher1() {
    }


    public Teacher1(int age, String name, int salary) {
        this.age = age;
        this.name = name;
        this.salary = salary;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", salary=" + salary +
                '}';
    }

}

 实现两种排序

创建一个TestTeacher类,用来实现两种排序,进行比较两种排序.

import java.util.Comparator;
import java.util.TreeSet;

public class TestTeacher {
    public static void main(String[] args) {
        TreeSet<Teacher> set=new TreeSet<>();
        Teacher t1=new Teacher(24,"王老师",1500);
        Teacher t2=new Teacher(18,"张老师",3500);
        Teacher t3=new Teacher(24,"赵老师",2500);
        Teacher t4=new Teacher(19,"李老师",4500);

        set.add(t1);
        set.add(t2);
        set.add(t3);
        set.add(t4);
        System.out.println("Comparable的排序结果:");
        System.out.println(set);
        System.out.println("--------------------------------------------");
        Teacher1 tt1=new Teacher1(24,"王老师",1500);
        Teacher1 tt2=new Teacher1(18,"张老师",3500);
        Teacher1 tt3=new Teacher1(24,"赵老师",2500);
        Teacher1 tt4=new Teacher1(19,"李老师",4500);

        TreeSet<Teacher1> set1=new TreeSet<>(new Comparator<Teacher1>() {
            @Override
            public int compare(Teacher1 o1, Teacher1 o2) {
//如果两个对象中属性数值相等(age相等或工资相等...),那么后一个对象就添加不上,所以要判断一下相等的情况;
                if (o1.getAge()-o2.getAge()!=0){
                    return o1.getAge()-o2.getAge();
                }else {
                    return o2.getSalary()-o1.getSalary();
                }

            }
        });
        set1.add(tt1);
        set1.add(tt2);
        set1.add(tt3);
        set1.add(tt4);
        System.out.println("Comparator的排序结果:");
        System.out.println(set1);
    }
}

 结果:

 总结:

自然排序Comparable和比较器Comparator可以实现一样的效果,但两种排序也有一些区别:

  1. 实现Comparable在实体类中实现,方便创建异常排序条件,多次使用。

  2. 实现Comparable排序条件固化,不便于条件的改变

  3. 实现Comparator可以在每次创建对象使用时,重写排序条件,较为复杂,不利于多次使用

  4. 实现Comparator排序条件灵活,便于条件的随时改变。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/339071.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前后对比效果展示的视频怎么制作?左右对比PR模板 Before and After v.2

10种表现方式&#xff0c;前后对比效果展示视频制作PR模板 Before and After v.2 如果您想比较两个图像或视频&#xff0c;这个Adobe Premiere Pro模板非常适合您。只需将两个文件拖放到媒体中&#xff0c;就可以开始了。 适合PS处理图片后期修图前后对比&#xff0c;AI绘图效果…

企业Oracle1 数据库管理

Oracle的安装 一、基础表的创建 1.1 切换到scott用户 用sys 账户 登录 解锁scott账户 alter user scott account unlock;conn scott/tiger;发现并不存在scott账户&#xff0c;自己创建一个&#xff1f; 查找资料后发现&#xff0c;scott用户的脚本需要自己执行一下 C:\ap…

FDM3D打印系列——宝可梦妙蛙种子

fdm打印妙蛙种子 大家好&#xff0c;我是阿赵。   每次打印3D模型&#xff0c;都有新的感觉&#xff0c;这次打印了个宝可梦里面的妙蛙种子&#xff0c;也就是俗称的蒜头王八。   先来看看成果&#xff0c;然后在后面再聊一下关于3D打印的一些体会。使用创想三维的Sermoon …

Linux内核pinctrl子系统驱动框架

一. 简介 本文简单了解一下Linux内核代码中&#xff0c; pinctrl子系统的驱动实现。 注意&#xff1a;本文会涉及到 Linux 驱动分层与分离、平台设备驱动等还未讲解的知识 &#xff0c;所以&#xff0c;也不会影响后续的实验。 二. Linux内核pinctrl子系统驱动 1. probe函…

C++笔记之bool类型的隐式转换现象与应用

C++笔记之bool类型的隐式转换现象与应用 —— 《C++ Primer Plus》 文章目录 C++笔记之bool类型的隐式转换现象与应用1.C++中,有几种类型和表达式可以隐式转换为bool类型2.使用explicit关键字来声明显示转换运算符,这样只有在使用static_cast<bool>时才能将对象转换为…

蓝桥杯理历年真题 —— 数学

1. 买不到的数目 这道题目&#xff0c;考得就是一个日常数学的积累&#xff0c;如果你学过这个公式的话&#xff0c;就是一道非常简单的输出问题&#xff1b;可是如果没学过&#xff0c;就非常吃亏&#xff0c;在考场上只能暴力求解&#xff0c;或是寻找规律。这就要求我们什么…

vue中的插槽

在vue中&#xff0c;有的名词听着高大上&#xff0c;挺怪异的&#xff0c;比如插槽&#xff0c;就是slot&#xff0c;它的作用是为了解决组件之间写的内容在组件中的使用问题。 一、插槽的作用 <!DOCTYPE html> <html> <head><title>Vue中的插槽</…

nginx虚拟主机

虚拟主机指的就是一个独立的站点配置&#xff0c;是nginx默认支持的一个功能&#xff0c;它能够有自己独立的域名&#xff0c;独立的ip&#xff0c;独立的端口配置&#xff0c;能够配置完整的www服务&#xff0c;列如网站搭建&#xff0c;邮件服务器代理等等。并且nginx支持多虚…

Macos数据库管理软件:Navicat Premium for Mac 16.3.5中文版

Navicat Premium 16 for Mac是一款强大的数据库管理和开发工具&#xff0c;支持多种数据库系统&#xff0c;如MySQL、Oracle、SQL Server等。它提供了直观的用户界面和丰富的功能&#xff0c;使用户能够轻松地创建、管理和维护数据库。 软件下载&#xff1a;Navicat Premium fo…

【书生·浦语大模型实战营05】《(5)LMDeploy 大模型量化部署实践》学习笔记

《(5)LMDeploy 大模型量化部署实践》 课程文档&#xff1a;《LMDeploy 的量化和部署》 1、大模型部署背景 1.1 模型部署 定义 将训练好的模型在特定软硬件环境中启动的过程&#xff0c;使模型能够接收输入并返回预测结果为了满足性能和效率的需求&#xff0c;常常需要对模型…

web架构师编辑器内容-完成属性设置的优化

对于业务组件来说&#xff0c;其属性是有很多的&#xff0c;如果把所有属性都平铺在页面上&#xff0c;就会非常长&#xff0c;而且想要更改其中的某些属性&#xff0c;可能需要向下滚动很久才能找到&#xff0c;对于UI的交互不是很友好&#xff0c;需要对属性的不同特性进行分…

OpenCompass 大模型评测

OpenCompass 大模型评测 关于测评的三个问题为什么需要测评&#xff1f;我们需要评测什么&#xff1f;怎么测试大预言模型&#xff1f; 主流大模型评测框架OpenCompass能力框架OpenCompass评测流水线设计 随着人工智能技术的快速发展&#xff0c; 大规模预训练自然语言模型成为…

线程同步--生产者消费者模型--单例模式线程池

文章目录 一.条件变量pthread线程库提供的条件变量操作 二.生产者消费者模型生产者消费者模型的高效性基于环形队列实现生产者消费者模型中的数据容器基于生产者消费者模型实现单例线程池 一.条件变量 条件变量是线程间共享的全局变量,线程间可以通过条件变量进行同步控制条件…

Springboot JSP项目如何以war、jar方式运行

文章目录 一&#xff0c;序二&#xff0c;样例代码1&#xff0c;代码结构2&#xff0c;完整代码备份 三&#xff0c;准备工作1. pom.xml 引入组件2. application.yml 指定jsp配置 四&#xff0c;war方式运行1. 修改pom.xml文件2. mvn执行打包 五&#xff0c;jar方式运行1. 修改…

表白墙网站PHP源码,支持封装成APP

源码介绍 PHP表白墙网站源码&#xff0c;适用于校园内或校区间使用&#xff0c;同时支持封装成APP。告别使用QQ空间的表白墙。 简单安装&#xff0c;只需PHP版本5.6以上即可。 通过上传程序进行安装&#xff0c;并设置账号密码&#xff0c;登录后台后切换模板&#xff0c;适配…

HCIA——21C/S、P2P、peer的选择

学习目标&#xff1a; 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议&#xff0c;了解典型网络设备的组成和特点&#xff0c;理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

Java面试题50道

文章目录 1.谈谈你对Spring的理解2.Spring的常用注解有哪些3.Spring中的bean线程安全吗4.Spring中的设计模式有哪些5.Spring事务传播行为有几种6.Spring是怎么解决循环依赖的7.SpringBoot自动配置原理8.SpringBoot配置文件类型以及加载顺序9.SpringCloud的常用组件有哪些10.说一…

Debian11下编译ADAravis和Motor模块的一条龙过程

Debian11编译EPICS ADAravis记录 一年前整理的上面文&#xff0c;这几天重新走了一遍&#xff0c;有些地方会碰到问题&#xff0c;需要补充些环节&#xff0c;motor模块以前和areaDetector一条龙编译时&#xff0c;总是有问题&#xff0c;当时就没尝试了&#xff0c;这几天尝试…

C#串口通讯控制4路继电上位机

C#串口通讯控制4路继电上位机 界面如下 源码如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text;//引入空间 using System.Windows.Forms; using System.I…

通过Stable Diffusion生成虚假的遥感影像

简介 这两天玩了一下stable diffusion&#xff0c;是真的好玩&#xff01; 然后我在想遥感有没有相关的生成模型&#xff0c;找了一下&#xff0c;还真找到了&#xff08;https://github.com/xiaoyuan1996/Stable-Diffusion-for-Remote-Sensing-Image-Generation/tree/main&a…