Java如何实现拼音排序?

news2024/9/22 1:38:01

在我们国家,按拼音进行排序是很常见的需求,比如姓名,那如何按拼音进行排序呢?

假如我们有以下List:

List<String> list = new ArrayList<>();
list.add("周瑜");
list.add("大都督");
list.add("周文王");
list.add("周武王");
list.add("周公");

如果我们采用最简单的排序方式:

list.sort(String::compareTo);

结果为:

[周公, 周文王, 周武王, 周瑜, 大都督]

很明显,结果不是拼音顺序,“大都督”应该要在最前面,那这种情况是按什么逻辑排的序呢?

上面的排序代码相当于:

list.sort(new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return s1.compareTo(s2);
    }
});

本质上是比较两个String的大小,小的排在前面,大的排在后面,那两个String默认是怎么比较大小的呢?

通过查看compareTo的源码,发现底层调用的是:

StringUTF16.compareTo(s1, s2)

因此,本质上比较的是两个String的UTF16编码的大小关系,比如:

  • “周瑜”的UTF16编码为:54 68 74 5C
  • “大都督”的UTF16编码为:59 27 90 FD 77 63

很明显,直接比较第一个字节就能发现“周瑜”小于“大都督”,因为54小于59,所以在排序结果中,“周瑜”排在了“大都督”的前面。

原谅我,以上都是铺垫,接下来才是正文,那如何按拼音进行排序呢?

排序的本质其实都一样,都是把字符转成特定的编码,然后比较编码的大小关系,那么有没有一种编码是按拼音来编码的呢?

有,那就是GBK。

比如:

  • “啊”的GKB编码为:B0 A1
  • “阿”的GKB编码为:B0 A2

或者,大家可以直接去看GBK的编码表:GBK编码表

我截其中一部分
image.png

可以发现,GBK是妥妥的按拼音顺序来的。

因此,我们只需要将字符串按GBK进行编码然后比较大小,就可以实现按拼音排序了,比如:

list.sort(new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        try {
            byte[] s1Bytes = s1.getBytes("GBK");
            byte[] s2Bytes = s2.getBytes("GBK");

            int s1Size = s1Bytes.length;
            int s2Size = s2Bytes.length;

            int size = Math.min(s1Size, s2Size);

            for (int i = 0; i < size; i++) {
                byte b1 = s1Bytes[i];
                byte b2 = s2Bytes[i];

                if (b1 != b2) {
                    return b1 - b2;
                }
            }

            return s1Size - s2Size;
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }

    }
});

这样,结果就变为了:

[大都督, 周公, 周文王, 周武王, 周瑜]

符合预期。

当然,上面的代码写的比较粗糙,Java中有现成的实现,比如:

list.sort(new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return Collator.getInstance(Locale.CHINESE).compare(s1, s2);

    }
});

结果也是:

[大都督, 周公, 周文王, 周武王, 周瑜]

或者你可以直接用Hutool提供的封装好的方法:

CollUtil.sortByPinyin(list);

本质都是一样的,都是按GBK来进行编码和排序的。

这就是拼音排序,感谢大家的点赞、关注、分享,谢谢。

我是大都督周瑜,欢迎关注我的公众号:IT周瑜,我会持续分享深度技术文章、常见经典面试题、学习路线、职业规范、实战经验。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis中缓存穿透、缓存击穿、缓存雪崩的详解

如何理解Redis缓存的穿透、击穿、雪崩问题&#xff1a; 缓存穿透 是指缓存中和数据库中都没有数据&#xff0c;而用户不断访问&#xff0c;导致这个不存在的数据每次请求都要到存储层去查询&#xff0c;这样失去了意义。 缓存穿透的解决方案有哪些? 缓存null值布隆过滤增强…

3D靓图!CEEMDAN-Kmeans-VMD-CNN-BiLSTM-Attention双重分解卷积双向长短期注意力多元时序预测

3D靓图&#xff01;CEEMDAN-Kmeans-VMD-CNN-BiLSTM-Attention双重分解卷积双向长短期注意力多元时序预测 目录 3D靓图&#xff01;CEEMDAN-Kmeans-VMD-CNN-BiLSTM-Attention双重分解卷积双向长短期注意力多元时序预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Ma…

【问题解决】git status中文文件名乱码

问题复现 解决办法 在git bash中直接执行如下命令 git config --global core.quotepath false原因 通过 git config --help 可以查看到以下内容&#xff1a; core.quotePath Commands that output paths (e.g. ls-files, diff), will quote “unusual” characters in the p…

vue3 更改 element-plus el-collapse 折叠面板样式

官网提供 展示效果 样式 更改箭头指向 :deep(.el-collapse-item__arrow){ transform: rotate(-270deg); } :deep(.el-collapse-item__header.is-active .el-collapse-item__arrow) { transform: rotate(270deg); } 二 &#xff1a; 或者隐藏右侧箭头 :deep(.el-collapse-i…

javase入门

最近在学习大数据,学到flume拦截器的时候发现自定义拦截器需要使用java编写,现在开始学一些java入门的东西. 一. java相关组成 path环境变量: 环境变量用于记住程序路径,方便在命令行窗口任意目录启动程序. 二 java中的变量 变量要先定义在使用. int age 15 定义变量要定义其…

8.6.数据库基础技术-数据库的控制

并非控制 事务&#xff1a;由一系列DML操作组成&#xff0c;这些操作&#xff0c;要么全做&#xff0c;要么全不做&#xff0c;它从第一个DML操作开始&#xff0c;rollback、commit或者DDL结束&#xff0c;拥有以下四种特性&#xff0c;详解如下&#xff1a; &#xff08;操作)…

OrangePi AIpro学习5 —— 模型推理程序开发

目录 一、准备工作 1.1 代码裁剪 1.2 测试运行 二、程序讲解 2.1 初始化 2.2 处理模型图片输入 2.3 推理函数 2.4 对输出结果进行处理 前言 本节主要讲解昇腾芯片&#xff0c;例程中使用resnet50推理图像类别的程序。本节讲解的程序&#xff0c;它的环境搭建与使用方法…

考PMP需要多久?一篇文章告诉你如何省心备考PMP

PMP备考需要半年时间吗&#xff1f;....是要满分拿下PMP吗&#xff1f; PMP备考不用半年时间&#xff0c;如果你想的话&#xff0c;可以一个多月就成功上岸哦。如果你不想的话&#xff0c;也可以半年。 其实大家认真去学习的&#xff0c;时间根本不需要那么长的时间&#xff0…

全新Bty分销系统源码v1.0/宝塔分销系统开源版源码/独立后台(附安装教程)

源码简介&#xff1a; 全新Bty分销系统源码v1.0&#xff0c;它作为宝塔分销系统开源版源码&#xff0c;功能强大&#xff0c;它内置了易支付功能&#xff0c;方便多了&#xff01; 这个Bty分销系统开源版&#xff0c;宝塔分销系统开源版。它基于宝塔开放的API底层控制器&…

LoadRunner12添加mysql数据连接驱动

参考链接 lr进行mysql参数化 https://jingyan.baidu.com/article/6d704a13407c4128db51ca2d.html 下载mysql数据库驱动教程 Loadrunner12使用MYSQL5.0参数化数据遇到的问题_loadrunner12 参数化没有效果-CSDN博客 mysql数据驱动下载链接 MySQL :: Download MySQL Connect…

centos 下如何安装openjdk21

文章目录 前言一、下载OpenJDK二、上传OpenJdk三、解压四、编辑环境变量五、重新加载一下配置六、验证是否安装成功 前言 本文章是自己将openjdk下载好&#xff01;手动上传解压的方式进行安装&#xff01; 一、下载OpenJDK OpenJdk官网&#xff1a;点击访问 二、上传OpenJ…

封装Form表单【后台控制表单搜索项的显隐和排序】

概要 为了实现需求&#xff1a;后台控制表单搜索项的显隐和排序&#xff1b; 整体思路流程 表单搜索项统一配置&#xff0c;封装成一个组件&#xff0c;把不同类别再封装成单个的组件&#xff0c;配置项数组由前端控制&#xff08;暂由前端配置&#xff0c;这样虽然代码量多&…

央行重提P2P存量业务化解,非吸案开始翻旧账?

沉寂已久的P2P&#xff0c;又突然以另一种意想不到的形式回到公众视野了。2018年全国P2P坍塌式暴雷&#xff0c;平台老板“跑路”“判刑”的消息一时间你方唱罢我登场。当年的某凰金融、某租宝、某信贷等赫赫有名的网贷平台传出的消息无非两类——查封或跑路&#xff0c;这几年…

外卖O2O系统开发源码开源介绍

外卖O2O系统开发源码开源介绍 开源外卖O2O系统源码可以为开发者提供快速搭建外卖平台的基础&#xff0c;节省从零开始的开发时间。 以下是几个推荐的开源项目&#xff1a; flash-waimai 是一个基于Spring Boot和Vue.js的前后端分离的外卖系统&#xff0c;包含手机端和后台管理…

代码随想录算法训练营第三十五天|背包问题理论基础、携带研究材料、分割等和子集

背包问题理论基础 1.背包问题概述 01背包&#xff1a;有n种物品&#xff0c;每种物品只有一个&#xff1b; 完全背包&#xff1a;有n种物品&#xff0c;每种物品有无限个&#xff1b; 多重背包&#xff1a;有n种物品&#xff0c;每种物品的个数各不相同。 2. 01背包 有n件…

旋转目标数据集制作:roLabelImg的安装和使用

目录 创建roLabelImg环境 安装pyqt5和lxml 下载roLabelImg源码包 使用roLabelImg roLabelImg常用操作指令 标注展示 由于最近一些项目需要标注旋转数据集&#xff0c;在网上找了一些教程&#xff0c;但大多数都显得比较杂乱&#xff0c;因此想把这些重新整理一下&#xf…

汽车免拆诊断案例 | 2013款北京现代悦动车发动机偶尔无法起动

故障现象 一辆2013款北京现代悦动车&#xff0c;搭载G4FC发动机&#xff0c;累计行驶里程约为13.9万km。车主反映&#xff0c;发动机偶尔无法起动着机&#xff0c;断开点火开关&#xff0c;等待一会儿又可以起动着机。 故障诊断 接车后反复试车&#xff0c;当发动机无法起动着…

TS RadiMation®软件EUT监测与控制:抗扰度测试的智能解决方案

随着电子设备在各个领域的广泛应用&#xff0c;确保它们在各种电磁环境中可靠运行变得尤为重要。TS RadiMation软件以其卓越的EUT监测与控制功能&#xff0c;为抗扰度测试提供了一站式智能解决方案。 在本文中&#xff0c;我们将深入探讨TS RadiMation如何通过先进的输入通道配…

【MATLAB第108期】基于MATLAB的fast、vbsa、dynia、eet、glue、pawn、rsa敏感性分析模型合集(无目标函数)【更新中】

【MATLAB第108期】基于MATLAB的fast、vbsa、dynia、eet、glue、pawn、rsa敏感性分析模型合集&#xff08;无目标函数&#xff09;【更新中】 一、FAST&#xff08;Fourier Amplitude Sensitivity Test&#xff09; FAST&#xff08;Fourier Amplitude Sensitivity Test&#…

2024年10大最佳研发工时管理系统推荐

这篇文章介绍了以下几个工具&#xff1a;PingCode、Worktile、无鱼项目工时系统、盖雅工厂、泽众ALM、蓝凌KMS、Forecast、EasyRedmine、Trello、Hubstaff。 在选择研发工时管理系统时&#xff0c;很多人都感到无从下手。市面上的工具五花八门&#xff0c;功能和特点各不相同&a…