由于本人有些懒惰,不喜欢写博客之类的如有不妥还请见谅在完成我的通讯录项目的时候,需要用到T9和字符串匹配,在网上和github找了一通,发现并没有理想的算法,由于这部分算法即便现在不研究,以后肯定有用得着的地方,于是决定自己研究一下,

下面将研究了一个星期的成果公布出来,自己创造的小算法,如果有更好的还请提示一下,

此算法通配一切,qwer匹配,T9匹配

此算法不支持多音字,准确度为95%,目前未研究出100%的匹配算法,因为非常非常奇葩的组合并不常见,当然我认为又要考虑速度又要准确度,这就是矛盾的,我们能做的就是尽可能的平衡,想要支持多音字可以通过本自行演变,算法版本 1 > 时间复杂度 : 最优 O (m+n) m:输入长度 n:不匹配首字母

</pre><pre class="java" name="code"><pre name="code" class="java"> * @author Maizer麦泽* @version 1* @category search,arithmetic* @param source*            来源的拼音字符数组* @param input*            用户输入的字符* @param colors*            长度为二的数组,用来保存从颜色凸显,例如:王小二->汉字 拼音为:[wang][xiao][er] 用户输入:wanx*            colors中会代入 0,2* @return true匹配成功,false匹配失败

算法版本 2简单的优化了一下

</pre><pre class="java" name="code"><pre name="code" class="java"> /*** * @param source* @param input* @param colors* @return*/static int i = 0;public static boolean searchPinYin(Object[] source, String input, int[] colors) {int inputIndex = 0;int sourceLetter = 0;int letterIndex = 0;int start = -1;int end = 0;char[] inputbyte_carray = input.toCharArray();char[] sourcebyte_carray = source[sourceLetter].toString().toCharArray();// while (inputIndex > -1 && inputIndex < input.length() && sourceLetter// < source.length) {A: while (true) {i++;if (sourcebyte_carray.length == 1 && sourcebyte_carray[0] == ' ') {sourceLetter++;if (sourceLetter >= source.length) {break;}sourcebyte_carray = source[sourceLetter].toString().toCharArray();if (sourcebyte_carray[0] == inputbyte_carray[inputIndex - 1]) {letterIndex++;}// 以上此处可选,只是用来检测为空的字符} else if (inputbyte_carray[inputIndex] == sourcebyte_carray[letterIndex]) {letterIndex++;inputIndex++;end = sourceLetter;if (start == -1) {start = sourceLetter;}if (inputIndex >= inputbyte_carray.length) {break A;} else if (letterIndex == sourcebyte_carray.length) {letterIndex = 0;sourceLetter++;if (sourceLetter >= source.length) {break;}sourcebyte_carray = source[sourceLetter].toString().toCharArray();while (true) {if (sourcebyte_carray[letterIndex] != inputbyte_carray[inputIndex - 1]) {if (inputIndex >= inputbyte_carray.length) {break A;}if (sourcebyte_carray[letterIndex-1] == inputbyte_carray[inputIndex]) {inputIndex++;}break;}letterIndex++;if (letterIndex == sourcebyte_carray.length) {letterIndex = 0;sourceLetter++;if (sourceLetter >= source.length) {break A;}sourcebyte_carray = source[sourceLetter].toString().toCharArray();}}}} else if (letterIndex == 0 && inputIndex > 0) {inputIndex--;if (inputIndex <= 0) {start = -1;}} else {letterIndex = 0;sourceLetter++;if (sourceLetter >= source.length) {break;}sourcebyte_carray = source[sourceLetter].toString().toCharArray();}}if (inputIndex == input.length()) {if (colors != null) {if (colors.length >= 2) {colors[0] = start;colors[1] = end + 1;}}return true;}return false;}

2.框架部分对于拼音搜索,本来想全部使用字母树,进行组合查找,但是因为内耗太大问题,不了了之,所以我摘选了首列字母树,什么是首列字母树?

首列字母树,就是将所有的拼音组合的首字母进行一个分类, 例如[wang][xiao][er],将w,x,e,分别分类到一个字母对象中,

这样当用户输入w就可以快速的搜到该列,再由以上的搜索算法进行后续的摘选,当然也可以定制树的深度,比如多列字母树等,从而控制搜索速度

当然,还有最基本的最后搜索结果的重用

联系人等拼音搜索算法与框架的心得相关推荐

  1. (三) Angular2项目框架搭建心得

    前言: 在哪看到过angular程序员被React程序员鄙视,略显尴尬,确实Angular挺值得被调侃的,在1.*版本存在的几个性能问题,性能优化的"潜规则"贼多,以及从1.*到2 ...

  2. 不使用pinyin4j, 通过字符串截取手段快速查询通讯录联系人的拼音(包括全拼和简拼)

    不使用pinyin4j, 通过字符串截取手段快速查询通讯录联系人的拼音(包括全拼和简拼) 刚开始我也是使用pinyin4j但是速度太慢8分钟还加载不完我的280个联系人数据,所以我选择另谋出路.发现有 ...

  3. thinkphp框架使用心得

    接触的第一个PHP框架就是TP,在使用的了一段时间后就放弃了,说实话TP的弊端挺多,之后又接触laravel框架,慢慢的就爱上laravel这个框架了.这段时间由于公司的原因,又不得不使用thinkp ...

  4. eggjs框架学习心得

    前言: eggjs作为阿里开源的企业级 Node.js 框架,其官网教程https://eggjs.org/zh-cn/tutorials/index.html介绍的很详细,可以帮助初学开发者快速搭建 ...

  5. 手机通讯录java首字母排序,Android联系人按拼音排序以及按汉字首字母或全拼搜索...

    今天用了整整一下午去捣鼓这块,为什么模拟器上可以按拼音排序,中英文混排,及按字母搜索联系人,但到了开发板(平台是根据android2.2改过的)上就怎么不行了呢,虽然现在还没有解决,但也是知道了问题所 ...

  6. Android联系人按拼音排序以及按汉字首字母或全拼搜索

    转:http://blog.csdn.net/csuhanyong/article/details/6120935 今天用了整整一下午去捣鼓这块,为什么模拟器上可以按拼音排序,中英文混排,及按字母搜索 ...

  7. 联系人按照拼音首字母排序

    这几天因为项目需要,要做一个仿小米拨号UI,因为小米拨号盘界面是显示通话记录和所有联系人信息的,在测试的过程中,测试部门反馈拨号盘显示的联系人杂乱没有规律,应该按照拼音首字母排序,问题提出来了以后,我 ...

  8. JSF+Seam框架学习心得

    http://developer.51cto.com   我目前的项目前端使用的是JSF+Seam框架,目前项目已经进入尾声,我想把一些心得体会给大家说说,以便大家在使用JSF的时候,少走弯路. 1. ...

  9. java 框架个人心得

    Java 框架之个人心得 作者:wangyp 2016 4 26     经过这一年的自我代码总结,发现对三大框架有了新的认识. Boss 系统框架主要是基于struts1 +ibatis ,也有st ...

最新文章

  1. 分享是程序员的必备素质
  2. 死磕Java并发:J.U.C之AQS同步状态的获取与释放
  3. Windows 窗体设计器中的设计时错误
  4. oleVariant序列化对象
  5. TurboMail邮件系统实用技巧十四:如何知道对方已经读信
  6. 线段树专辑——pku 3667 Hotel
  7. 使用ogg实现oracle到kafka的增量数据实时同步
  8. 今日头条面试题:生成随机数(根据rand5()生成rand7())
  9. (116)FPGA面试题-FIFO相关参数与信号,为什么要用格雷码
  10. 基于JAVA+SpringMVC+Mybatis+MYSQL的学生公寓管理系统
  11. ROS2的学习笔记(legacy)
  12. 走进 Growth Hacker 的世界
  13. LeetCode—数据库简单题(三)
  14. springcloud之bus消息总线
  15. Nginx源码安装,配置开机自启
  16. 软件测试之编写测试用例
  17. 10041---用mycat做读写分离:基于 MySQL主从复制
  18. 齐纳二极管 稳压二极管 SOD123封装 正负区分
  19. Oracle 10g RAC 维护工具完全详解
  20. react useCallback的用法

热门文章

  1. 解决el--checkbox 复选框的禁用方法
  2. 数学建模:插值与拟合—插值问题的python求解
  3. 电商平台订单获取API接口文档
  4. SQLyog Community免费版下载地址
  5. Echarts 3D地图图表
  6. 可调式减压阀行业现状调研及趋势分析报告
  7. 在网站中插入 英文地图非谷歌
  8. 按广义表表示二叉树结构生成二叉树链表的算法
  9. linux程序绑定硬件id,Linux:在系统上设置hostid?
  10. SpringBoot+JWT实现登陆token验证并存储用户信息