Android中汉字转拼音的优化
Android中一种高效省资源的汉字转拼音的实现
我在开发Android项目中经常会遇到汉字转拼音的需求,主要是一些按拼音排序,首字母本地搜索匹配的需求,这些需求的特点是这样的:不要求处理声调和多音字,但是对算法效率,内存占用要求较高。下面我分享一下我方案和实现。
基于unicode码的索引实现
原理:
我们常用的汉字大概有19000多个,在unicode编码里是连续的,范围是u4E00-u9FA5。unicode编撰的人可能对汉子不是很了解,所以编码的顺序没什么规律。汉语拼音的组合,比如这些:chang,dao,cui。这些组合一共有400多个。
我想到的方案是将所有拼音组合作为一张表。每个汉字unicode码对应一个拼音组合表的索引。汉字转拼音的时候直接通过unicode码找到对应索引,然后查到对应的拼音。这样实现的算法复杂度为O(1)。
内存占用稍微大一点,两张表一共占用为42k字节。
实现:
1,拼音组合的表,作为一个常量数据,类似下面这样:
这个常量数组会常驻内存,内存占用大概2k左右。
2,unicode索引文件,索引文件的作用是通过汉字unicode码找到拼音表对应的拼音,所以最简单的实现就是两列的表,第一列是unicode(汉字所在范围都是16位,2字节),第二列是拼音表中的索引(0-407,需要16位表示,2字节)。类似下面这样:
但其实仔细一下,第一列unicode码是连续的,如果全部减去4E00,第一列就变成0,1,2,3,4…这样,其实没用必要存在,转拼音时候只要把汉字unicode减去4E00就能找到对应的索引。所以去掉第一列这个文件就是一个索引的数组。文件大小是40k,也需要常驻内存。
简单的流程示意如下:
具体的实现已经开源到github,地址:
https://github.com/joker535/tinyPinyin
Android中汉字转拼音的优化相关推荐
- Java/Android中汉字转拼音的两种方法,优劣比较
一.前言 在我们的开发中,有时会有这样的需求,就是联系人列表按照拼音顺序排列(如通讯录).于是,我也在网上搜到了许多这类的文章,就两种最常见的做法在此进行简单的比较和分析 二.汉字转拼音的方法 使用第 ...
- Android中汉字转拼音的两种方法,优劣比较
一.前言 在我们的开发中,有时会有这样的需求,就是联系人列表按照拼音顺序排列(如通讯录).于是,我也在网上搜到了许多这类的文章,就两种最常见的做法在此进行简单的比较和分析 二.汉字转拼音的方法 使用第 ...
- android中汉字转为拼音
汉语转为拼音 首先要先导入架包:com.belerweb:pinyin4j:2.5.1 工具类: 注释的方法,是可以将单个汉字转为拼音的,为注释的可以转化词语, public class HanZiT ...
- Android中对图片的内存优化方法
Android 中对于图片的内存优化方法 1. 对图片本身进行操作 尽量不要使用 setImageBitmap.setImageResource.BitmapFactory.decodeResourc ...
- java 判断汉字音调_Java中汉字转拼音pinyin4j用法实例分析
本文实例讲述了Java中汉字转拼音pinyin4j用法.分享给大家供大家参考,具体如下: 汉字转换拼音在日常开发中是个很常见的问题.例如我们伟大的12306,在地名中输入"WH", ...
- Android输入汉字得到拼音
前一段时间,研究Android的通讯录,在它的contacts2.db数据库中发现raw_contacts表中有sort_key这一列用于排序的汉语拼音等信息,就突然想到我们可以利用它得到汉字相应的拼 ...
- Android/Java汉字转拼音类及按A-Z排序方法
在Android / java 开发中有时需要对数据进行根据拼音[A-Z]的规则进行排序所以需要先将汉字转为拼音然后再进行排序 //汉字转拼音类 package xyz.sort; import ja ...
- android中文首字母排序,Android上汉字按拼音排序如何实现?
具体的代码在 packages\providers\contactsprovider\src\com\android\providers\contacts\ContactL ocaleUtils.ja ...
- android 汉字转字节,android实现汉字转拼音功能 带多音字识别
android 汉字转拼音带多音字识别功能,供大家参考,具体内容如下 问题来源 在做地名按首字母排序的时候出现了这样一个bug.长沙会被翻译拼音成zhangsha,重庆会被翻译拼音成zhong qin ...
最新文章
- html字符实体和实体名称 lt;
- 用神经网络二分类吸引子与排斥子
- python for everybody课程作业_Programming for Everybody (Python)-Lecture 7 课程笔记
- PHP面试 PHP基础知识 八(会话控制)
- vector的reserve和resize
- S如何边缘控制_强夯法效果如何?来看看这个检测结果
- 广西全国计算机二级考试内容,全国高校计算机等级考试(广西考区)二级考试大纲.doc...
- Element-UI 要怎么学?官方文档!
- Wireshark使用技巧详解
- JSON.stringify方法详解
- mysql 纯真ip 导出dat_纯真IP数据库(qqwry.dat)转换成最新的IP数据库格式(ipwry.dat)
- 微带贴片天线的分析方法-传输线模型法
- js复制富文本/网页内容到黏贴板
- 北京周边10个樱桃采摘地
- 简易的抽奖系统(二)
- The second day :天猫精灵玩法之创建意图,实现对话功能
- Wonderware-InTouch与PLC的冗余配置
- HTML基本语法学习
- 百度网盘秒传链接生成及提取方法
- 【学习笔记】LSTM 李弘毅
热门文章
- 2018.2.5 PHP如何写好一个程序用框架
- acm 1465 java做法
- 论文复现之医学图像应用:视网膜血管分割
- 拉卡拉手机刷卡器音频通讯技术原理初步分析
- Macbook Pro 密码设置
- java毕业生设计校园流浪猫图鉴管理系统的设计与实现计算机源码+系统+mysql+调试部署+lw
- Matlab or Python trace 峰值探测
- C语言使用函数递归实现n的k次方(包括负数次方)
- [全程建模]响应张恂之《青润,你的胡扯还不够吗?》第三篇及一个腾讯的岗位需求...
- 【论文阅读|深读】Role2Vec:Role-Based Graph Embeddings