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中汉字转拼音的优化相关推荐

  1. Java/Android中汉字转拼音的两种方法,优劣比较

    一.前言 在我们的开发中,有时会有这样的需求,就是联系人列表按照拼音顺序排列(如通讯录).于是,我也在网上搜到了许多这类的文章,就两种最常见的做法在此进行简单的比较和分析 二.汉字转拼音的方法 使用第 ...

  2. Android中汉字转拼音的两种方法,优劣比较

    一.前言 在我们的开发中,有时会有这样的需求,就是联系人列表按照拼音顺序排列(如通讯录).于是,我也在网上搜到了许多这类的文章,就两种最常见的做法在此进行简单的比较和分析 二.汉字转拼音的方法 使用第 ...

  3. android中汉字转为拼音

    汉语转为拼音 首先要先导入架包:com.belerweb:pinyin4j:2.5.1 工具类: 注释的方法,是可以将单个汉字转为拼音的,为注释的可以转化词语, public class HanZiT ...

  4. Android中对图片的内存优化方法

    Android 中对于图片的内存优化方法 1. 对图片本身进行操作 尽量不要使用 setImageBitmap.setImageResource.BitmapFactory.decodeResourc ...

  5. java 判断汉字音调_Java中汉字转拼音pinyin4j用法实例分析

    本文实例讲述了Java中汉字转拼音pinyin4j用法.分享给大家供大家参考,具体如下: 汉字转换拼音在日常开发中是个很常见的问题.例如我们伟大的12306,在地名中输入"WH", ...

  6. Android输入汉字得到拼音

    前一段时间,研究Android的通讯录,在它的contacts2.db数据库中发现raw_contacts表中有sort_key这一列用于排序的汉语拼音等信息,就突然想到我们可以利用它得到汉字相应的拼 ...

  7. Android/Java汉字转拼音类及按A-Z排序方法

    在Android / java 开发中有时需要对数据进行根据拼音[A-Z]的规则进行排序所以需要先将汉字转为拼音然后再进行排序 //汉字转拼音类 package xyz.sort; import ja ...

  8. android中文首字母排序,Android上汉字按拼音排序如何实现?

    具体的代码在 packages\providers\contactsprovider\src\com\android\providers\contacts\ContactL ocaleUtils.ja ...

  9. android 汉字转字节,android实现汉字转拼音功能 带多音字识别

    android 汉字转拼音带多音字识别功能,供大家参考,具体内容如下 问题来源 在做地名按首字母排序的时候出现了这样一个bug.长沙会被翻译拼音成zhangsha,重庆会被翻译拼音成zhong qin ...

最新文章

  1. html字符实体和实体名称 lt;
  2. 用神经网络二分类吸引子与排斥子
  3. python for everybody课程作业_Programming for Everybody (Python)-Lecture 7 课程笔记
  4. PHP面试 PHP基础知识 八(会话控制)
  5. vector的reserve和resize
  6. S如何边缘控制_强夯法效果如何?来看看这个检测结果
  7. 广西全国计算机二级考试内容,全国高校计算机等级考试(广西考区)二级考试大纲.doc...
  8. Element-UI 要怎么学?官方文档!
  9. Wireshark使用技巧详解
  10. JSON.stringify方法详解
  11. mysql 纯真ip 导出dat_纯真IP数据库(qqwry.dat)转换成最新的IP数据库格式(ipwry.dat)
  12. 微带贴片天线的分析方法-传输线模型法
  13. js复制富文本/网页内容到黏贴板
  14. 北京周边10个樱桃采摘地
  15. 简易的抽奖系统(二)
  16. The second day :天猫精灵玩法之创建意图,实现对话功能
  17. Wonderware-InTouch与PLC的冗余配置
  18. HTML基本语法学习
  19. 百度网盘秒传链接生成及提取方法
  20. 【学习笔记】LSTM 李弘毅

热门文章

  1. 2018.2.5 PHP如何写好一个程序用框架
  2. acm 1465 java做法
  3. 论文复现之医学图像应用:视网膜血管分割
  4. 拉卡拉手机刷卡器音频通讯技术原理初步分析
  5. Macbook Pro 密码设置
  6. java毕业生设计校园流浪猫图鉴管理系统的设计与实现计算机源码+系统+mysql+调试部署+lw
  7. Matlab or Python trace 峰值探测
  8. C语言使用函数递归实现n的k次方(包括负数次方)
  9. [全程建模]响应张恂之《青润,你的胡扯还不够吗?》第三篇及一个腾讯的岗位需求...
  10. 【论文阅读|深读】Role2Vec:Role-Based Graph Embeddings