【Java基础·Comparator多字段排序】

2023-11-07

【Java基础·Comparator多字段排序】

需求

对指定List按照 身份证号、姓名、入学时间倒序排列

版本1

package com.biaogexf.tools;

import lombok.Data;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class MultiFieldSortByComparatorTest {
    public static void main(String[] args) {
        List<User> usersList = new ArrayList<>();

        // 构建多个实例
        fillContent(usersList);
        // 输出列表
        printData(usersList);
        // 按照 身份证号、姓名、入学时间 倒序
        dataSort(usersList);
        // 查看排序后的列表
        printData(usersList);
    }

    private static void dataSort(List<User> usersList) {
        Collections.sort(usersList, new Comparator<User>(){
            @Override
            public int compare(User obj1, User obj2) {
                int cr = 0;
                // 按身份证号降序排列
                int a = obj2.getIdNumber().compareTo(obj1.getIdNumber());
                if (a != 0) {
                    cr = (a > 0) ? 3: -1;
                } else {
                    // 按姓名降序排列
                    a = obj2.getName().compareTo(obj1.getName());
                    if (a != 0) {
                        cr = (a > 0) ? 2: -2;
                    } else {
                        // 按入学时间降序排列
                        a = obj2.getInfoDate().compareTo(obj1.getInfoDate());
                        if (a != 0) {
                            cr = (a > 0) ? 1: -3;
                        }
                    }
                }

                return cr;
            }
        });
    }

    private static void printData(List<User> usersList) {
        System.out.println("====================");
        for (User user : usersList) {
            System.out.println(user);
        }
        System.out.println("====================");
    }

    private static void fillContent(List<User> usersList) {
        User user1 = new User();
        user1.setIdNumber("1");
        user1.setName("11");
        user1.setInfoDate("111");
        usersList.add(user1);

        User user2 = new User();
        user2.setIdNumber("2");
        user2.setName("11");
        user2.setInfoDate("111");
        usersList.add(user2);

        User user3 = new User();
        user3.setIdNumber("2");
        user3.setName("22");
        user3.setInfoDate("222");
        usersList.add(user3);

        User user5 = new User();
        user5.setIdNumber("2");
        user5.setName("11");
        user5.setInfoDate("222");
        usersList.add(user5);
    }
}

@Data
class User {
    /** 身份证号 */
    private String idNumber;
    /** 姓名 */
    private String name;
    /** 入学时间 */
    private String infoDate;
}

阿里巴巴规范:

1.Collections.sort可替换为List.sort

2.匿名Comparator()可替换为lambda表达式

版本2

package com.biaogexf.tools;

import lombok.Data;

import java.util.ArrayList;
import java.util.List;

public class MultiFieldSortByComparatorTest {
    public static void main(String[] args) {
        List<User> usersList = new ArrayList<>();

        // 构建多个实例
        fillContent(usersList);
        // 输出列表
        printData(usersList);
        // 按照 身份证号、姓名、入学时间 倒序
        dataSort(usersList);
        // 查看排序后的列表
        printData(usersList);
    }

    private static void dataSort(List<User> usersList) {
        usersList.sort((obj1, obj2) -> {
            int cr = 0;
            // 按身份证号降序排列
            int a = obj2.getIdNumber().compareTo(obj1.getIdNumber());
            if (a != 0) {
                cr = (a > 0) ? 3 : -1;
            } else {
                // 按姓名降序排列
                a = obj2.getName().compareTo(obj1.getName());
                if (a != 0) {
                    cr = (a > 0) ? 2 : -2;
                } else {
                    // 按入学时间降序排列
                    a = obj2.getInfoDate().compareTo(obj1.getInfoDate());
                    if (a != 0) {
                        cr = (a > 0) ? 1 : -3;
                    }
                }
            }

            return cr;
        });
    }

    private static void printData(List<User> usersList) {
        System.out.println("====================");
        for (User user : usersList) {
            System.out.println(user);
        }
        System.out.println("====================");
    }

    private static void fillContent(List<User> usersList) {
        User user1 = new User();
        user1.setIdNumber("1");
        user1.setName("11");
        user1.setInfoDate("111");
        usersList.add(user1);

        User user2 = new User();
        user2.setIdNumber("2");
        user2.setName("11");
        user2.setInfoDate("111");
        usersList.add(user2);

        User user3 = new User();
        user3.setIdNumber("2");
        user3.setName("22");
        user3.setInfoDate("222");
        usersList.add(user3);

        User user5 = new User();
        user5.setIdNumber("2");
        user5.setName("11");
        user5.setInfoDate("222");
        usersList.add(user5);
    }
}

@Data
class User {
    /** 身份证号 */
    private String idNumber;
    /** 姓名 */
    private String name;
    /** 入学时间 */
    private String infoDate;
}

输出

====================
User(idNumber=1, name=11, infoDate=111)
User(idNumber=2, name=11, infoDate=111)
User(idNumber=2, name=22, infoDate=222)
User(idNumber=2, name=11, infoDate=222)
====================
====================
User(idNumber=2, name=22, infoDate=222)
User(idNumber=2, name=11, infoDate=222)
User(idNumber=2, name=11, infoDate=111)
User(idNumber=1, name=11, infoDate=111)
====================

感悟

比较器Comparator中的compare方法定义的是排序的规则!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Java基础·Comparator多字段排序】 的相关文章

  • 具有更高可见性的重写方法是良好的实践吗?

    回答这个问题 如何使用 GUI 使用 PaintComponent 初始化 GUI 然后添加基于鼠标的 GUI https stackoverflow com questions 21336141 how to gui using pain
  • 如果在睡眠线程上调用interrupt()会发生什么?

    我有一个线程 然后run I call sleep 如果我中断这个线程会发生什么 MyThread extends Thread public void run try sleep 1000000 catch InterruptedExce
  • 无法使用maven编译java项目

    我正在尝试在 java 16 0 1 上使用 maven 构建 IntelliJ 项目 但它无法编译我的项目 尽管 IntelliJ 能够成功完成 在此之前 我使用maven编译了一个java 15项目 但我决定将所有内容更新到16 0 1
  • 在文本文件中搜索单词并返回其频率

    如何在包含单词文本的文本文件中搜索特定单词并返回其频率或出现次数 使用扫描仪 String text Question how to search for a particular word in a text file containin
  • 使用 RecyclerView 适配器在运行时更改布局屏幕

    我有两个布局文件 如下所示 如果列表中存在数据 则我显示此布局 当列表为空时 我会显示此布局 现在我想在运行时更改布局 当用户从列表中删除最后一项时 我想将布局更改为第二张图片中显示的 空购物车布局 In getItemCount Recy
  • 记录骆驼路线

    我的项目中有几个 Camel 上下文 如果可能的话 我想以逆向工程方式记录路线 因为我们希望保持与上下文相关的文档最新 最好的方法是什么 我们倾向于预先实际设计路线 并使用来自EIP book http www eaipatterns co
  • 如何让spring为JdbcMetadataStore创建相应的schema?

    我想使用此处描述的 jdbc 元数据存储 https docs spring io spring integration docs 5 2 0 BUILD SNAPSHOT reference html jdbc html jdbc met
  • 在java中实现你自己的阻塞队列

    我知道这个问题之前已经被问过并回答过很多次了 但我只是无法根据互联网上找到的示例找出窍门 例如this http tutorials jenkov com java concurrency blocking queues html or t
  • 将表值参数与 SQL Server JDBC 结合使用

    任何人都可以提供一些有关如何将表值参数 TVP 与 SQL Server JDBC 一起使用的指导吗 我使用的是微软提供的6 0版本的SQL Server驱动程序 我已经查看了官方文档 https msdn microsoft com en
  • Java 8 中函数式接口的使用

    这是来自的后续问题Java 8 中的 双冒号 运算符 https stackoverflow com questions 20001427 double colon operator in java 8其中 Java 允许您使用以下方式引用
  • 列表应该如何转换为具体的实现?

    假设我正在使用一个我不知道源代码的库 它有一个返回列表的方法 如下所示 public List
  • RSA OAEP、Golang 加密、Java 解密 -BadPaddingException:解密错误

    我正在尝试解密使用 RSA OAEP 在 Golang 中加密的字符串 但出现 BadPaddingException 解密错误 很难弄清楚我错过了什么 这是Golang加密方法 func encryptString rootPEM io
  • Java 收集返回顶级项目的映射的嵌套流

    我有以下模型 class Item String name List
  • Android Studio 将音乐文件读取为文本文件,如何恢复它?

    gameAlert mp3是我的声音文件 运行应用程序时 它询问我该文件不与任何文件类型关联 请定义关联 我选择TextFile错误地 现在我的音乐文件被读取为文本文件 我如何将其转换回music file protected void o
  • 如何在 Eclipse Java 动态 Web 项目中使用 .properties 文件?

    我正在 Eclipse 中开发动态 Web 项目 我创建了一个 properties 文件来存储数据库详细信息 用户名 密码等 我通过右键单击项目和 New gt File 添加它 我使用了Java util包Properties类 但它不
  • JVM:是否可以操作帧堆栈?

    假设我需要执行N同一线程中的任务 这些任务有时可能需要来自外部存储的一些值 我事先不知道哪个任务可能需要这样的值以及何时 获取速度要快得多M价值观是一次性的而不是相同的M值在M查询外部存储 注意我不能指望任务本身进行合作 它们只不过是 ja
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • Java &= 运算符应用 & 或 && 吗?

    Assuming boolean a false 我想知道是否这样做 a b 相当于 a a b logical AND a is false hence b is not evaluated 或者另一方面 这意味着 a a b Bitwi
  • 嵌入式 Jetty - 以编程方式添加基于表单的身份验证

    有没有一种方法可以按如下方式以编程方式添加基于表单的身份验证 我用的是我自己的LdapLoginModule 最初我使用基本身份验证并且工作正常 但现在我想在登录页面上进行更多控制 例如显示徽标等 有没有好的样品 我正在使用嵌入式 jett
  • JAXB - 列表<可序列化>?

    我使用 xjc 制作了一些课程 public class MyType XmlElementRefs XmlElementRef name MyInnerType type JAXBElement class required false

随机推荐

  • 解决yolov7bug(Command ‘git tag‘ returned non-zero exit status 128.)(IndexError: list index out of ran)

    1 问题 执行train py Command git tag returned non zero exit status 128 原因 使用预训练权重 但路径错误 未找到本地预训练权重 它会自动下载 下载被墙 解决方法 从github下载
  • 透视投影详解

    透视投影详解 概述 投影变换完成的是如何将三维模型显示到二维视口上 这是一个三维到二维的过程 你可以将投影变换看作是调整照相机的焦距 它模拟了为照相机选择镜头的过程 投影变换是所有变换中最复杂的一个 视锥体 视锥体是一个三维体 他的位置和摄
  • electron 获取电脑mac地址遇到的坑

    最近公司需求做一个exe程序 无奈只是一个小前端 只能使用electron来实现了 其中一个需求就是每个账号绑定唯一的电脑 这里选用网卡的mac地址来做这个唯一的字段 代码很简单 测试也很顺利 const mainWindow new Br
  • 房地产投资占GDP比例畸高 中国房地产泡沫是一颗毒瘤

    转 http house ifeng com detail 2014 05 04 46139202 0 shtml 房地产投资占GDP比例畸高 2013年房地产投资占GDP比例高达16 而事实上从1960年来但凡房地产投资占GDP比例高于6
  • 昇思MindSpore安装教程

    目录 昇思MindSpore安装教程 MindSpore 安装MindSpore 开始安装 创建虚拟环境 进入工作目录 下载完成 验证是否成功安装 关注MindSpore社区官方号 昇思MindSpore安装教程 MindSpore 它是华
  • [js] : js 设置 style 的 important

    const div document getElementById xxx div style setProperty height 100px important api 详情 参见 CSSStyleDeclaration getProp
  • 论文笔记:Blockchain in Industries: A Survey

    一 基本信息 论文题目 Blockchain in Industries A Survey 发表时间 IEEE Access 2019 作者及单位 二 摘要 区块链技术近来已成为研究和工业界的最前沿 因为它们为许多行业带来了潜在的好处 这是
  • 02_Numpy学习笔记(下):随机采样

    02 Numpy学习笔记 下 随机采样 文章目录 02 Numpy学习笔记 下 随机采样 一 离散型随机变量的分布 1 二项分布 2 泊松分布 3 超几何分布 二 连续型随机变量的分布 1 均匀分布 2 正态分布 3 指数分布 三 其他随机
  • 华为OD机试真题 Java 实现【日志采集系统】【2023Q1 100分】,附详细解题思路

    目录 一 题目描述 二 输入描述 三 输出描述 四 解题思路 五 Java算法源码 六 效果展示 1 输入 2 输出 3 说明 一 题目描述 日志采集是运维系统的的核心组件 日志是按行生成 每行记做一条 由采集系统分批上报 如果上报太频繁
  • Python装饰器探究

    说在前边 装饰器作为Python中的一个比较实用的东西 在我们日常库的使用过程中经常使用 但是其细节问题我们却常常忘记考虑 本文章就此问题写建装饰器代码来进行一步一步分析 装饰器实验 1 我们常见的装饰器使用方式 from functool
  • ROS激光SLAM导航理解

    ROS激光SLAM导航理解 注 最近学习ROS的激光导航知识 需要理清ROS的SLAM 环境感知 costmap 与导航算法 为防止自己忘记 将觉得有价值的内容收集于此 对AGV来说 SLAM是个大大坑 环境感知和局部运动控制也是大坑 学习
  • 数据库添加/删除/修改 表字段(超详细)

    Oracle 添加 删除 修改 表字段 超详细 1 添加表字段 1 1 语法结构 1 2 举例说明 1 新建学生信息表 该步骤可忽略 2 初始表样子 3 语法解释 2 修改表字段 2 1 语法结构 1 修改字段属性 2 修改字段名 2 2
  • games101课程作业,在Vs2019环境下的配置环境(不使用虚拟机)

    为什么不使用虚拟机 因为虚拟机使用ubuntu x64版本系统 是一个从未接触过的系统 不好使用 虚拟机中无法使用中文输入法 无法对代码进行注释 不利于学习 虚拟机性能差 打开两三个文件就卡 令人抓狂 要使用终端进行编译 很是麻烦 还是喜欢
  • 面试经典-不被忽略的@property

    我们都知道 property是用来声明属性的 可以保存类的状态或信息 而与其相关的内容 诸如copy weak 深拷贝等 经常会在面试的过程中出现 接下来深入下这些模糊 熟悉的内容 理理顺 内容概要 1 property的本质 2 自动合成
  • Profinet 的交互流程

    Profinet 的交互流程 启动过程 在启动Profinet IO设备时 在设置IP地址之前 使用DCP协议 该协议类似于DHCP协议 PLC发送DCP广播消息 Identify 子网上的所有IO设备都使用本身的MAC地址进行应答 PLC
  • 机器学习算法与Python实践之(六)二分k均值聚类

    机器学习算法与Python实践之 六 二分k均值聚类 zouxy09 qq com http blog csdn net zouxy09 机器学习算法与Python实践这个系列主要是参考 机器学习实战 这本书 因为自己想学习Python 然
  • 基于IDEA的Java学生管理系统

    1 创建学生类 package studentManager public class Student 定义成员变量 private String num 学号 private String name 姓名 private String a
  • 善用Linux内核中的各种数据结构和算法

    1 介绍 在数据结构和算法一文中经常就信手拈来一些基本数据结构和算法 如链表 队列 栈 二叉树等等 但是在C的标准库中并没有自带这些 C 通过STL 类程序库等等会带这些 那么在嵌入式开发里面怎么快速方便使用这些数据结构和算法咧 答案就是从
  • OpenGL 理解GL_TRIANGLE_STRIP等绘制三角形序列的三种方式

    OpenGL 理解GL TRIANGLE STRIP等绘制三角形序列的三种方式 2012 04 12 20 19 19389人阅读 评论 7 收藏 举报 GL TRIANGLE STRIP绘制三角形方式很多时候令人疑惑 在这里对其运作机理进
  • 【Java基础·Comparator多字段排序】

    Java基础 Comparator多字段排序 需求 对指定List按照 身份证号 姓名 入学时间倒序排列 版本1 package com biaogexf tools import lombok Data import java util