浅析pinyin4j源码 简单利用pinyin4j对中文字符进行自然排序(转)
pinyin4j项目 官网地址 http://pinyin4j.sourceforge.net/
我们先把资源下载下来,连同源码和jar包一起放入工程。如下图:
接下来在demo包下,我们写一个测试类,简单使用pinyin4j对中文字符进行自然排序
新建一个ConvertTest.java
package demo; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sourceforge.pinyin4j.PinyinHelper; public class ConvertTest { public static void main(String[] args) { String src = "我们中间出了一个叛徒"; char[] arr = src.toCharArray(); System.out.println("数组长度是:"+arr.length); System.out.print("原始顺序:"); for (char temp : arr) { System.out.print(temp+" "); } System.out.println(); convertToHanyuPinyin(arr); } private static List<String> convertToHanyuPinyin(char[] array){ HashMap<String, String> map = new HashMap<String, String>(); for (int i = 0; i < array.length; i++) { //得到拼音首字母 String value = (PinyinHelper.toHanyuPinyinStringArray(array[i]))[0].substring(0, 1); map.put(String.valueOf(array[i]), value); } System.out.println(map); List<String> list = sort(map); return list; } private static List<String> sort(Map map){ List<Map.Entry<String, String>> infoIds = new ArrayList<Map.Entry<String, String>>(map.entrySet()); // 对HashMap中的 value 进行排序 Collections.sort(infoIds, new Comparator<Map.Entry<String, String>>() { @Override public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) { return (o1.getValue()).compareTo(o2.getValue()); } }); List<String> list = new ArrayList<String>(); /*****************FOR TEST***********************/ List<String> letterList = new ArrayList<String>(); /*****************FOR TEST***********************/ // 对HashMap中的 value 进行排序后 显示排序结果 for (int i = 0; i < infoIds.size(); i++) { Map.Entry<String,String> entry = infoIds.get(i); list.add(entry.getKey()); letterList.add(entry.getValue()); } /*****************FOR TEST***********************/ System.out.print("自然顺序:"); for (String string : list) { System.out.print(string + " "); } System.out.println(); System.out.print("字母顺序:"); for (String string : letterList) { System.out.print(string +" "); } /*****************FOR TEST***********************/ return list; } }
输出结果为:
可以看到最终的输出顺序已经是按照自然顺序排序后的结果了。
简单说一下步骤:
1.我们先将字符串序列转换成 单个字符key, 首字母value 的map形式,
如 {个=g, 徒=t, 我=w, 出=c, 叛=p, 了=l, 中=z, 一=y, 间=j, 们=m}。
2. 然后针对map中的value进行排序,并返回排序过后的key值。
(PS:当然这里也可以对key值进行排序,但是最好还是针对value。
因为我们这里截取的是首字母,并不是整个拼音音节。)
代码缺点:
1.只是针对中文字符的第一个拼音进行排序,但是汉语中存在多音字。
2.只是针对字符的首字母进行排序,并不是整个拼音字节,并不严谨,适合粗略排序的场景。
下面简单分析一下,pinyin4j的转换流程。
如上图,其中核心的类就是PinyinHelper。它可以转换许多类型的拼音,这里我们只看汉语拼音,其他的与之类似。
追踪代码 PinyinHelper.toHanyuPinyinStringArray
按ctrl + 鼠标左键。
static public String[] toHanyuPinyinStringArray(char ch){return getUnformattedHanyuPinyinStringArray(ch); }
继续跟踪代码
private static String[] getUnformattedHanyuPinyinStringArray(char ch){return ChineseToPinyinResource.getInstance().getHanyuPinyinStringArray(ch); }
调用ChineseToPinyinResource示例的getHanyuPinyinStringArray方法
String[] getHanyuPinyinStringArray(char ch){String pinyinRecord = getHanyuPinyinRecordFromChar(ch);if (null != pinyinRecord) { //得到左括号( 的索引值 int indexOfLeftBracket = pinyinRecord.indexOf(Field.LEFT_BRACKET); //得到右括号) 的索引值 int indexOfRightBracket = pinyinRecord.lastIndexOf(Field.RIGHT_BRACKET); //得到字符对应的拼音 String stripedString = pinyinRecord.substring(indexOfLeftBracket + Field.LEFT_BRACKET.length(), indexOfRightBracket); //以逗号.为分隔 返回String[] 数组 return stripedString.split(Field.COMMA); } else return null; // no record found or mal-formatted record }
关键的方法getHanyuPinyinRecordFromChar
private String getHanyuPinyinRecordFromChar(char ch){int codePointOfChar = ch;//转换成unicode对应的字符 String codepointHexStr = Integer.toHexString(codePointOfChar).toUpperCase(); //从表中查询字符 // fetch from hashtable String foundRecord = getUnicodeToHanyuPinyinTable().getProperty(codepointHexStr); //如果是合法的字符就返回,否则返回null return isValidRecord(foundRecord) ? foundRecord : null; }
就是如下图的资源:
http://www.cnblogs.com/sphere/p/4738888.html
浅析pinyin4j源码 简单利用pinyin4j对中文字符进行自然排序(转)相关推荐
- 微信授权2.0php源码,微信网页授权(OAuth2.0) PHP 源码简单实现
微信网页授权(OAuth2.0) PHP 源码简单实现 来源:中文源码网 浏览: 次 日期:2018年9月2日 [下载文档: 微信网页授权(OAuth2.0) PHP 源码简单实现.tx ...
- poco源码简单分析
自动化工具poco源码简单分析 Airtest简介 Airtest是网易游戏开源的一款UI自动化测试项目,目前处于公开测试阶段,该项目分为AirtestIDE.Airtest.Poco.Testlab ...
- android 点击事件消费,Android View事件分发和消费源码简单理解
Android View事件分发和消费源码简单理解 前言: 开发过程中觉得View事件这块是特别烧脑的,看了好久,才自认为看明白.中间上网查了下singwhatiwanna粉丝的读书笔记,有种茅塞顿开 ...
- Hessian 源码简单分析
Hessian 源码简单分析 Hessian 是一个rpc框架, 我们需要先写一个服务端, 然后在客户端远程的调用它即可. 服务端: 服务端通常和spring 做集成. 首先写一个接口: public ...
- 线程的3种实现方式并深入源码简单分析实现原理
前言 本文介绍下线程的3种实现方式并深入源码简单的阐述下原理 三种实现方式 Thread Runnable Callable&Future 深入源码简单刨析 Thread Thread类实现了 ...
- FFmpeg的HEVC解码器源码简单分析:概述
===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...
- FFmpeg的HEVC解码器源码简单分析:解码器主干部分
===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...
- JSP 编译和运行过程与JSP源码简单分析
JSP 编译和运行过程与JSP转移源码简单分析 Web容器处理JSP文件请求的执行过程主要包括以下4个部分: 1. 客户端发出Request请求 2. JSP Container 将JSP转译成Ser ...
- [HXBCTF 2021]easywill writeup(WillPHP源码审计+利用pearcmd.php文件包含getshell)
[HXBCTF 2021]easywill writeup(WillPHP源码审计+利用pearcmd.php文件包含getshell) [HXBCTF 2021]easywill 1.WillPHP ...
最新文章
- SOA和SaaS的区别
- js 输出中文乱码 解决办法
- 模块的四种形式 模块的调用 循环导入问题 模块的搜索路径 py文件的两种用途 编译python文件 包...
- STM32的FSMC详解
- python 正则表达式 re.search
- access 查找工龄大于30_同济大学大学计算机access作业答案
- CSS深入理解vertical-align和line-height的基友关系
- 使用Jmeter对mysql进行性能测试入门
- lisp正负调换_lisp中如何把符号转换为字符串
- 中芯国际人事变动:蒋尚义回归 传梁孟松要走
- python游标卡尺什么梗_Python这个缩进让我焦头烂额!最奇葩的缩进,没有之一!...
- python在规划类专业的作用_城乡规划学Python、Gis有哪些具体的作用?
- Java 8日期– LocalDate,LocalDateTime,即时
- 华硕物联网机器人今年推出 开发进入最后阶段
- 刀片服务器接显示器,刀片服务器的vga切换方法
- html 视频在线播放,HTML 视频(Video)播放
- mac苹果电脑有什么免费的系统清理软件?
- 安卓app里播放youtube视频
- STM32与ARM7、ARM9、ARM11
- CrossAir CA-S01 SMD贴片天线使用步骤
热门文章
- TypeScript 基础类型
- 高可用高性能负载均衡软件HAproxy详解指南-第三章:HAproxy实例
- IT小妙招之:快马加鞭,Windows 7启动大提速
- HDU 6015 Skip the Class
- MIT黑科技:“不开卷也有益”,计算机不翻书就能读完一本书
- URL/URI/URN的认识
- 实时通信技术之websocket
- java中为什么不能通过getClass().getName()获取父类的类名
- 两个什么漏洞,可让十亿安卓手机被获取Root权限?
- [New Portal]Windows Azure Virtual Machine (8) Virtual Machine高可用(上)