使用pinyin4j解决中文排序时候多音字问题

news2024/9/21 16:34:09

1、引入jar包

        <dependency>
            <groupId>com.belerweb</groupId>
            <artifactId>pinyin4j</artifactId>
            <version>2.5.1</version>
        </dependency>

2、工具类

public class SortUtil {

    private static HanyuPinyinOutputFormat pinyinOutputFormat = new HanyuPinyinOutputFormat();

    //根据省份首字母排序
    public static void getSortLetter(String[] oriArray) {
        Arrays.sort(oriArray, new Comparator<String>() {
            HanyuPinyinOutputFormat pinyinOutputFormat = new HanyuPinyinOutputFormat();
            @Override
            public int compare(String oriArray1, String oriArray2) {
                try {
                    oriArray1 = PinyinHelper.toHanYuPinyinString(oriArray1, pinyinOutputFormat, " ", true);
                    oriArray2 = PinyinHelper.toHanYuPinyinString(oriArray2, pinyinOutputFormat, " ", true);

                } catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) {
                    badHanyuPinyinOutputFormatCombination.printStackTrace();
                }
                return oriArray1.compareTo(oriArray2);
            }
        });
  }

        /**
         * 根据指定字段对 List 集合进行排序。
         *
         * @param list 需要排序的 List 集合
         * @param sortField 排序字段
         */
        public static <T> List<T> sortByField(List<T> list, String sortField) {
            Comparator<T> comparator = (o1, o2) -> {
                String value1 = getValueByField(o1, sortField);
                String value2 = getValueByField(o2, sortField);

                try {
                    value1 = PinyinHelper.toHanYuPinyinString(value1, pinyinOutputFormat, " ", true);
                    value2 = PinyinHelper.toHanYuPinyinString(value2, pinyinOutputFormat, " ", true);
                } catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) {
                    badHanyuPinyinOutputFormatCombination.printStackTrace();
                }
                return value1.compareTo(value2);
            };

            Collections.sort(list, comparator);
            return list;
        }



        /**
         * 根据字段名称获取对象的属性值。
         *
         * @param object 对象
         * @param fieldName 字段名称
         * @return 字段值
         */
        private static <T> String getValueByField(T object, String fieldName) {
            try {
                // 假设字段名称是以 "get" 开头的方法
                String methodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
                Class<?> clazz = object.getClass();
                Method method = clazz.getMethod(methodName);
                Object value = method.invoke(object);
                return value.toString();
            } catch (Exception e) {
                e.printStackTrace();
                return "";
            }
        }

3、测试demo

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.RequiredArgsConstructor;

import java.time.LocalDateTime;

@Data
@RequiredArgsConstructor
@AllArgsConstructor
public class Province{
       private String id;
       private String name;
       private LocalDateTime createTime;

}
  /**
     * 主要看重庆市的省份首字母排序---是按照chong,还是zhong来排序
     * @param args
     */
    public static void main(String[] args) {
        List<Province> provinceList = new ArrayList<>();

        provinceList.add(new Province("1","北京市", LocalDateTime.now()));
        provinceList.add(new Province("3","上海市", LocalDateTime.now()));
        provinceList.add(new Province("4","河北省", LocalDateTime.now()));
        provinceList.add(new Province("6","宁夏回族自治区", LocalDateTime.now()));
        provinceList.add(new Province("5","广西省", LocalDateTime.now()));
        provinceList.add(new Province("9","黑龙江省", LocalDateTime.now()));
        provinceList.add(new Province("2","重庆市", LocalDateTime.now()));
        provinceList.add(new Province("8","江西省", LocalDateTime.now()));
        /**
         * provinceList:需要排序的集合
         * name:要根据哪个字段来排序
         */
        List<Province> list = sortByField(provinceList, "name");
        list.forEach(System.out::println);
    }

返回结果如下

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

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

相关文章

[米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-02 MAC层程序设计

软件版本&#xff1a;Anlogic -TD5.9.1-DR1_ES1.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用安路(Anlogic)FPGA 实验平台&#xff1a;米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…

SX_c语言字符带空格字符串读写_9

改项目的时候又发现c语言读字符串的一些细节这里做补充其中%[^\n]可以读取带空格的字符串 #include <stdio.h>int main(){char cmd;scanf("%c", &cmd);char time[32] {0};scanf("%s", time);printf("%c\n", cmd);printf("%s&quo…

QT使用腾讯云对象存储SDK报错:`undefined reference to qcloud_cos`

QT使用腾讯云对象存储SDK编译时报错&#xff1a;undefined reference to qcloud_cos 文章目录 QT使用腾讯云对象存储SDK编译时报错&#xff1a;undefined reference to qcloud_cos问题1&#xff1a;在VS中编译cossdk报错LNK1104 无法打开文件“PocoFoundationd.lib”问题2&…

海外媒体发稿:意大利-展新社/意大利金融报的影响力

一.IT WDPP&#xff1a;世界发展新闻社意大利站 世界发展新闻社&#xff08;展新社&#xff09;是全球顶级通讯社之一&#xff0c;其在全球多国设立分社&#xff0c;热门资讯覆盖全球18种主流语言。作为世界发展新闻社的意大利站&#xff0c;IT WDPP以其独特的视角和深度报道&…

工具学习_CONAN_Consuming Packages

1. Build a simple CMake project using Conan 首先创建一个使用最流行的 C 库之一 Zlib 的字符串压缩器应用程序&#xff0c;教程将使用 CMake 构建系统&#xff0c;但需要注意 Conan 适用于任何系统构建方式。 为了完成教程&#xff0c;首先下载对应的项目&#xff1a; git…

大学生助学贷款

大学生助学贷款 文章目录 大学生助学贷款生源地贷款1. 网上申请2. 线下申请 生源地贷款 助学贷款分为生源地贷款和高校助学贷款, 一般情况下都是申请的生源地贷款.第一次贷款, 需要现在网上申请, 申请结束之后, 会有两张表, 贷款申请表和困难认定申请表.注意: 贷款申请表和困难…

pdf转图片要怎么转?6个软件帮助你轻松转换图片格式

pdf转图片要怎么转&#xff1f;6个软件帮助你轻松转换图片格式 将PDF文件转换为图片格式是许多用户的常见需求&#xff0c;尤其是在需要展示、编辑或分享PDF内容时。以下是六款能够帮助你快速、轻松地将PDF转换为图片格式的软件&#xff1a; 迅捷PDF转换器 这是一款非常简单好…

Redis01——Redis简介

目录 NOSQL与SQL的差异 数据结构&#xff1a;结构化 VS 非结构化 数据关联&#xff1a;关系型 VS 非关系型 数据查询&#xff1a;SQL查询 VS 非SQL查询 事务特性&#xff1a;满足事 VS 没有完全满足 Redis 简介 Redis 安装 Redis 数据结构简介 Redis 常用命令&#xff…

论文被Turnitin查出AI率,会受影响吗?

无论是作业或是毕业论文的提交&#xff0c;原创性已成为了硬性标准。因此提交前都会使用Turnitin&#xff08;www.checktoo.com&#xff09;进行论文检测&#xff0c;用来确保其原创性。可当Turnitin报告能显示出论文的AI率时&#xff0c;越来越多学者开始担忧“这会对我的论文…

c++单例实践

C单例实践 在日常开发中&#xff0c;虽然太多的单例调用会让代码的耦合度变高&#xff0c;但是例如日志类这种&#xff0c;单例模式就变得非常有。所以这篇文章为大家介绍static 关键字相关知识以及如何实现自己的C单例类。 static关键字 首先让我们请出今天的主角: static。…

Brave浏览器:开启隐私保护新时代

今天电脑天空要向大家介绍一款专注隐私安全的浏览器——BraveBrowser&#xff0c;它不仅仅是一个浏览工具&#xff0c;更是你在线隐私的守护者&#xff01; BraveBrowser是一款免费且开源的网络浏览器&#xff0c;它的核心优势在于其强大的广告和跟踪器阻止功能。想象一下&…

数据要素流通交易的场景概述

00前言 数据要素作为国家重点发展方向&#xff0c;如何发挥其数据要素价值是目前研究的重点。核心的观点是流动的数据才能产生价值&#xff0c;如果数据并没有开放、共享那么价值一定是有限的。目前&#xff0c;数据流通类型主要包括数据开放、数据共享和数据交易三种。 数据…

【Python学习手册(第四版)】学习笔记16-函数基础

个人总结难免疏漏&#xff0c;请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。 本文主要介绍Python中函数的基本概念&#xff0c;作用域以及参数传递&#xff0c;函数语法以及def和return语句的操作&#xff0c;函数调用表达式的行为&#xff…

AWS DMS遇到 Error : no handler found for uri

问题描述&#xff1a; 当我按照文档[1]配置AWS DMS 目标端为OpenSearch, 并进行数据迁移的时候&#xff0c;我遇到了如下报错&#xff1a; 00015696: 2024-07-31T03:26:57 [TARGET_LOAD ]E: Elasticsearch:FAILED SourceTable:test TargetIndex:test Operation:INSERT_E…

Mysql80主从复制搭建;遇到问题 Slave_IO_Running: Connecting和Slave_SQL_Running以及解决过程

总结主要步骤 1.配置一个提供复制的账号&#xff1b; 创建用户 CREATE USER replication% IDENTIFIED BY your_password; GRANT REPLICATION SLAVE ON *.* TO replication%; FLUSH PRIVILEGES;2.修改配置 选择模式 主库配置&#xff1b; windows的得话是my.ini文件 默认这个目…

Vue项目学习(1)

1、进入cmd命令行——> vue ui ——>等等操作 2、 3、src目录下 4、vue项目的启动 &#xff08;1&#xff09; &#xff08;2&#xff09; 5、如何更改前端vue项目的端口号&#xff1f;——>去vue.config.js里配置应一个对象

云端医疗解决方案:互联网医院系统的云计算架构与实现

随着云计算技术的成熟和普及&#xff0c;医疗行业开始探索云端解决方案&#xff0c;以应对数据存储、计算能力和系统扩展性等方面的挑战。互联网医院系统作为医疗信息化的重要组成部分&#xff0c;通过云计算架构实现了高效、灵活和可扩展的医疗服务。本文将深入探讨互联网医院…

【vulnhub】DC-2靶机

信息收集 靶机扫描 nmap 192.168.93.1/24 端口扫描 网页访问 发现访问不到&#xff0c;根据显示考虑IP未遵循重定向到域名 在本机的C:\Windows\System32\drivers\etc 修改hosts⽂件&#xff0c;添加192.168.93.136 dc-2 再次进行访问&#xff0c;可以访问到 点击flag&#x…

牛客JS题(十七)总成绩排名

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; 引用传值深拷贝合理封装 题干&#xff1a; 我的答案 <!DOCTYPE html> <html><head><meta charset"utf-8" /></head><body><script type"text/javascript&quo…

ResNet原理

一、ResNet基础架构 残差块 批量归一化层 二、ResNet网络参数详解 三、ResNet总结 残差网络的出现使人们摆脱了深度的束缚&#xff0c;大幅改善了深度神经网络中的模型退化问题&#xff0c;使网络层数从数十层跃升至几百上千层&#xff0c;大幅提高了模型精度&#xff0c;通用…