Java自定义实现字符串比较器-按照数字大小排序

2023-11-12

背景

在日常开发中,经常会遇到一些字符串排序的场景:

  • 场景一:字符串中包含的是纯数字,比较时想按照正常的数字大小进行排序;
  • 场景二:字符串中既包含数字又包含普通字符,比较时 普通字符想按照默认的字典进行排序,遇到字符串时则按照数字大小进行比较。

举例

  1. 存在以下纯数字组成的字符串,希望按照数字大小进行排序:“12”,“2”,“9”,“16”,“34”,“15”,“89”,“3”,“56”,“7”
List<String> list = Lists.newArrayList("12""2""9""16""34""15""89""3""56""7");
list.sort((o1, o2) -> {
            Integer num1 = Integer.parseInt(o1);
            Integer num2 = Integer.parseInt(o2);
            return num1.compareTo(num2);
        });
list.forEach(System.out::println);

输出结果:

2
3
7
9
12
15
16
34
56
89
  1. 存在以下复杂的字符串,同时包含普通字符和数字,希望也按照上述的排序方式进行排序
List<String> list = new ArrayList<>();
list.add("2023年第16周");
list.add("2023年第3周");
list.add("2023年第10周");
list.add("2023年第9周");
list.add("2023年第23周");
list.sort(new ComplexNumberStringComparator());
list.forEach(System.out::println);

其输出结果为:

2023年第3周
2023年第9周
2023年第10周
2023年第16周
2023年第23周

ComplexNumberStringComparator 类即为自定义实现的字符串比较器,代码如下:

public class ComplexNumberStringComparator implements Comparator<String> {
    @Override
    public int compare(String s1, String s2) {
        int i1 = 0, i2 = 0;
        while (i1 < s1.length() && i2 < s2.length()) {
            char c1 = s1.charAt(i1);
            char c2 = s1.charAt(i2);
            if (Character.isDigit(c1) && Character.isDigit(c2)) {
                //比较数字大小
                int num1 = getNumber(s1, i1);
                int num2 = getNumber(s2, i2);
                if (num1 != num2) {
                    return Integer.compare(num1, num2);
                }
                //相同数字时继续比较下一位
                i1 += Integer.toString(num1).length();
                i2 += Integer.toString(num2).length();
            } else {
                //普通字符按照字典排序
                if (c1 != c2) {
                    return Character.compare(c1, c2);
                }
                i1++;
                i2++;
            }
        }
        //如果前缀相同,则长度短的字符串排在前面
        return Integer.compare(s1.length(), s2.length());
    }

    private int getNumber(String s, int start) {
        int end = start;
        while (end < s.length() && Character.isDigit(s.charAt(end))) {
            end++;
        }
        return Integer.parseInt(s.substring(start, end));
    }

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

Java自定义实现字符串比较器-按照数字大小排序 的相关文章

  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供

随机推荐

  • java读取properties配置文件工具类

    获取配置文件中配置信息 String xxx DataParamReader getDataParam xxx public class DataParamReader private static Logger log Logger ge
  • 小学生阅读测试软件,小学生阅读能力测评

    小学生阅读能力测评 由会员分享 可在线阅读 更多相关 小学生阅读能力测评 4页珍藏版 请在人人文库网上搜索 1 小学生阅读水平测评在课堂教学中使用形成性评价有什么好的做法 一 视听结合 感知理解 提升阅读效率 阅读教学是语文教学的重要组成部
  • linux 查找当前系统nginx 的路径

    nginx 的路径查找 工作中有很多服务器 它们上面装的 nginx 的路径也太不相当 当我们拿到一个不熟悉的服务器时 我们怎么知道 当前运行的nginx 的目录是哪一个呢 并且还有一种情况是 本机中有两个以上的nginx 的目录 那么我们
  • JAVA中的循环结构

    1 什么是Java中的循环结构 在Java编程中 我们经常使用循环结构来完成重复的任务 循环结构是一种非常有用的工具 可以让我们在程序中反复执行某个操作 直到满足特定条件为止 2 在Java中循环结构的分类有哪些 Java中有三种主要的循环
  • 哈希算法(哈希函数)基本

    一 什么是哈希 Hash 哈希也称 散列 函数或 杂凑 函数 它是一个不可逆的单向映射 将任意长度的输入消息M 或文件F 映射成为一个较短的定长哈希值H M 也叫散列值 HashValue 杂凑值或消息摘要 可见 这是一种单向密码体制 只有
  • MySQL5.6 双机HA高可用部署方案

    1 mysql主备机管理信息 10 0 0 10 192 168 2 6 10 0 0 11 192 168 2 8 注 前面的是管理地址 括号中为生产地址 mysq vip 192 168 2 9 注 mysql双机软件通过上面的vip对
  • JS数组中对象ID相同(对象相同属性)对某值进行相加与数组去重

    1 数组对象相同属性的相加 let obj const arr id 0 stock 1 id 2 stock 1 id 2 stock 33 id 1 stock 2 id 0 stock 0 第一种方式 arr forEach item
  • 嵌入式Linux入门-彻底理解UART串口,手把手教你写程序

    UART串口这个东西 是嵌入式学习上避不开的 不仅在调试中经常用到 还有很多模块通过串口与SOC相连 这篇文章让你彻彻底底 搞明白串口程序的编写 没有基础的先看 嵌入式Linux学习系列全部文章 嵌入式Linux学习 从裸机到应用教程大全
  • 操作系统概念-----多进程管理

    操作系统的核心就是多进程管理 单个CPU如果顺序执行程序 效果如图 读磁盘是一个很消耗时间的操作 但是读磁盘并不是一个需要cpu的操作 所以cpu在读磁盘的时候去如果去执行程序B的话 cpu利用率就会增加 那么问题来了 当从程序A切换到B再
  • mysql 常用的查询命令

    55 从Key1中获取rand1 SELECT rand1 FROM key first WHERE key first id 1 数据如下 查询表名 show tables 查询字段 select COLUMN NAME from inf
  • Node Sass does not yet support your current environment

    异常信息 Module build failed Error Node Sass does not yet support your current environment Windows 64 bit with Unsupported r
  • 【云原生】Docker 网络模式详解、容器间网络通信

    当项目大规模使用 Docker 时 容器通信的问题也就产生了 要解决容器通信问题 必须先了解很多关于网络的知识 Docker 作为目前最火的轻量级容器技术 有很多令人称道的功能 也有着很多不完善的地方 网络方面就是 Docker 比较薄弱的
  • 官网下载 Xshell 或 Xftp 的个人免费版本

    如果你还在找 Xshell 或 Xftp 的破解版 完全没必要 因为官方已经针对个人用户 提供了完全免费版本 官方免费版下载步骤如下 https www netsarang com zh free for home school 点击邮件中
  • 解决 Uncaught SyntaxError: Unexpected token ‘<‘

    解决 Uncaught SyntaxError Unexpected token lt 在写第一个React用例时候 代码如下
  • 爬虫 自动化工具-mongo-多线程爬虫

    一 selenium框架 1 selenium介绍 介绍 1 selenium是一个web自动化测试用的框架 程序员可以通过代码实现对浏览器的控制 比如打开网页 点 击网页中的元素 实现鼠标滚动等操作 2 它支持多款浏览器 如谷歌浏览器 火
  • spring---web项目结构分层

    一般的web结构 在前后台分离的情况下 我们对前端一般会以WEB API的形式同过JSON交互来与前端进行交互 一般来讲 我们的数据模型会在controller层进行交互 进行数据的校验与处理 然后交给service层进行相应的逻辑处理 如
  • OpenCV+ip摄像头实现远程实时监控

    一 项目准备 本项目所使用的内容有 1 ip摄像头app 主要依靠连接其ip来实现远程连接的效果 效果和遥控无人机所用的app功能类似 2 外接扩展显示屏 HDMI接口 这个不是必需品 但是多一个屏就方面观察 想自动识别某些物品并记录等等的
  • TS 对象可能为“未定义”,不能将类型“ XXXX

    前言 最近用 typeScript 也就是大家常说的 TS 写点东西 但是老是提醒这个未定义 那个可能为空 主要是 tsconfig json 中的严格模式我没关 所以今天总结一下 严格模式中 TS 中遇到 对象可能为 未定义 的具体场景
  • 资产扫描神器ARL增强改造

    拉取项目 首先从GitHub克隆到服务器上 git clone https github com ki9mu ARL plus docker 修改配置文件 因为ARL在配置文件里设置了黑名单 有时候项目为GOV或者EDU之类的时候无法进行扫
  • Java自定义实现字符串比较器-按照数字大小排序

    背景 在日常开发中 经常会遇到一些字符串排序的场景 场景一 字符串中包含的是纯数字 比较时想按照正常的数字大小进行排序 场景二 字符串中既包含数字又包含普通字符 比较时 普通字符想按照默认的字典进行排序 遇到字符串时则按照数字大小进行比较