在通讯录应用中,快速搜索匹配符合关键字的联系人,是一个必备的需求。比如要搜索 名字 尼古拉斯赵四 ,电话号码 1234567 这个联系人,我们可以输入:

1.中文全名 尼古拉斯赵四
2.中文部分名字 赵四
3.拼音全拼 nigulasizhaosi
4.拼音部分 nigu
5.拼音部分首字 ngls
6.拼音首字和部分全拼 ngulasi
7.电话号码匹配

如此多的搜索方式,如果没有一个比较恰当的算法,会导致有很多的if else判断,逻辑也会显得比较复杂。下面是我总结的一个高效的算法。
对于电话号码和纯中文的匹配,应该是没什么难度的,直接检索就可以了,难点是拼音首字母和拼音全拼的组合差异。解决方法就是在联系人的数据结构中准备两个字符串集合,一个集合存储每个中文字的拼音首字母,一个集合存储每个中文字的全拼,在检索的时候对这两个集合做适当的排列组合,去匹配拼音可能的组合方式。

public class ContactItem {private String name;     //名字private char firstChar;  //索引的首字母private String number;   //电话号码private List<String> fullpingyins = new ArrayList<>();private List<String> firstpingyins = new ArrayList<>();
 Pattern p = Pattern.compile("[\u4E00-\u9FA5a-zA-Z]+");Matcher m = p.matcher(item.getName());if(m.lookingAt()){//如果是以汉字或字母开头,则获取拼音字符串和首字符int end = m.end();String substr = item.getName().substring(0,end);char [] namechars = substr.toCharArray();//获取全拼for(char c : namechars){String pingyin = getPingyin(c);item.getFullpingyins().add(pingyin);}//每个字的首字母char [] firstpingyins = getFirstSpell(substr).toCharArray();for (char c : firstpingyins){item.getFirstpingyins().add(String.valueOf(c));}item.setFirstChar(firstpingyins[0]);}

把数据准备好之后,接下来就是匹配搜索

 public void search(final String keystr, final boolean onlyNumber){Thread thread = new Thread(){@Overridepublic void run() {List<ContactItem> matchlist = new ArrayList<>();for (ContactItem item : contactItems){Pattern pattern = Pattern.compile(keystr);Matcher matcher = null;//匹配全名StringBuffer stringBuffer = new StringBuffer();matcher = pattern.matcher(stringBuffer.append(item.getFullpingyins()));if(matcher.find()){matchlist.add(item);continue;}//匹配缩写stringBuffer = new StringBuffer();matcher = pattern.matcher(stringBuffer.append(item.getFirstpingyins()));if(matcher.lookingAt()){matchlist.add(item);continue;}if(matcher.find()){matchlist.add(item);continue;}boolean isfind = false;//缩写加全写,先把缩写逐个替换到全称中匹配for(int f = 0 ; f < item.getFirstpingyins().size() ; f++){StringBuffer sb = new StringBuffer();for (int k =0 ; k < item.getFullpingyins().size() ;k ++){if(f == k){sb.append(item.getFirstpingyins().get(f));continue;}sb.append(item.getFullpingyins().get(k));}matcher = pattern.matcher(sb);if(matcher.lookingAt()){matchlist.add(item);isfind = true;break;}}if(isfind){continue;}//缩写加全写,把全拼逐个替换到缩写中匹配for(int f = 0 ; f < item.getFullpingyins().size() ; f++){StringBuffer sb = new StringBuffer();for (int k =0 ; k < item.getFirstpingyins().size() ;k ++){if(f == k){sb.append(item.getFullpingyins().get(f));continue;}sb.append(item.getFirstpingyins().get(k));}matcher = pattern.matcher(sb);if(matcher.lookingAt()){matchlist.add(item);isfind = true;break;}}if(isfind){continue;}//匹配号码if(TextUtils.isEmpty(item.getNumber())){continue;}matcher = pattern.matcher(item.getNumber());if(matcher.find()){matchlist.add(item);continue;}}}};thread.start();}

快速搜索匹配联系人算法相关推荐

  1. 聚类算法小记(part1)--基于密度峰快速搜索的聚类算法

    学习笔记,仅供参考,有错必纠 文章目录 引言 DPC算法概述 例子 缺点 引言 2014 年 6 月 Science 发表了自动确定类簇数和类簇中心的新聚类算法 DPC (clustering by ...

  2. 智能拨号的联系人快速模糊匹配的算法

    1. https://github.com/handsomezhou/PinyinSearchLibrary 2. http://blog.csdn.net/gaobaoshen1/article/d ...

  3. 一种基于快速GeoHash实现海量商品与商圈高效匹配的算法

    摘要 闲鱼app根据交通条件.商场分布情况.住宅区分布情况综合考虑,将城市划分为一个个商圈.杭州部分区域商圈划分如下图所示.   闲鱼的商品是由用户发布的GPS随机分布在地图上的点数据.当用户处于某个 ...

  4. 快速搜索随机树算法(RRT)和A*算法

    1.快速搜索随机树算法 1.1 简述快速搜索随机树算法 快速生长随机树算法需要知道整个环境信息,通过随机采样的方法并通过一系列判断来找到起点和终点之间的一条可行路线.这种方法在概率上是可以找到一条可行 ...

  5. laravel 分词搜索匹配度_DSSM文本匹配模型在苏宁商品语义召回上的应用

    文本匹配是自然语言处理中的一个核心问题,它不同于MT.MRC.QA 等end-to-end型任务,一般是以文本相似度计算的形式在应用系统中起核心支撑作用1.它可以应用于各种类型的自然语言处理任务中,例 ...

  6. android t9搜索算法,T9拨号盘搜索和排序算法

    T9拨号盘搜索和排序算法 一. 背景 今日头条为何能突破bat的壁垒,很大程度在于它精确的推荐算法, 能够根据用户的喜爱推荐适合用户的资讯,不断根据用户的浏览记录构建用户的偏好生态圈,进而精准投放流量 ...

  7. 2021.11.22【读书笔记】丨生物信息学与功能基因组学(第五章第五节 用类似于BLAST的比对工具快速搜索基因组DNA)

    5.5 用类似于BLAST的比对工具快速搜索基因组DNA 需求:随着基因组DNA数据库数量增长,对比对工具要求越来越高 能在基因组DNA中找到外显子 比对时考虑基因组DNA包含的测序错误 有相应的算法 ...

  8. 项目文件快速搜索神器

    快速搜索神器 项目代码:github地址 先看看我们的项目成果吧 汉字搜索 汉字首字母搜索 汉字全拼搜索 1.调研实现背景 在linux环境下有非常好用的find命令,查找文档非常的高效,但是在win ...

  9. 项目 - 文档快速搜索工具

    一.项目简介: Linux操作系统中提供了find指令查找指定文件,为了实现在Windows操作系统中实现文件的快搜搜索,利用所学知识实现文件搜索工具,与软件everything工具具有一定的相同功能 ...

最新文章

  1. 教你实现GPUImage【OpenGL渲染原理】
  2. 微软 Surface Pro、Studio、Laptop 全线更新
  3. python学习笔记3-循环1
  4. Asp.net中的路由
  5. java理解程序逻辑_使用java理解程序逻辑(5)
  6. kafka高可用集群原理
  7. 让我们用jOOλ在Java 8中流式传输地图
  8. oracle创建job一年执行,Oracle快速创建定时job执行批量转储过程脚本参考案例
  9. 使用Python+pillow绘制矩阵盖尔圆
  10. ES6新特性_ES6模块化介绍_优势_以及产品---JavaScript_ECMAScript_ES6-ES11新特性工作笔记041
  11. Java程序设计实验2
  12. 【cluvfy】集群验证工具cluvfy使用方法——stage
  13. 数据包络分析-两阶段网络DEA(two stage network)
  14. 【ELIXIR】简单说下elixir的历史
  15. 中国水墨动画系列 内容简介
  16. 除了专业技能,Web前端工程师需要具备哪些基本素质?
  17. 变量的存在意义和底层逻辑(《Java与Python学习通法》)
  18. 计算机主机接口有哪些,主机接口有哪些
  19. 金莹江苏省计算机学会教授,第二届江苏省青年计算机精英论坛”在江南大学举行...
  20. anaconda中的包如何传到pycharm中使用?

热门文章

  1. vue通过xlsx-style导出数据
  2. wow服务器信息,魔兽世界2.4服务器最新消息和消息汇总
  3. c 语言loadimage方法吗,CBitmap, HBITMAP和LoadImage
  4. 东软已经失去发展的动力了吗(转自东软内网)
  5. TMP451温度传感器
  6. 直播预告 | 合宙是在走窄路吗?专注优势与广泛发展的选择
  7. 开源夏令营《基于HackRF开发GPS信号仿真模拟器》工作总结(三)
  8. java毕业设计维保管理系统mybatis+源码+调试部署+系统+数据库+lw
  9. SAP_MIGO过账库存数量为0,库存价值是负的-0.01
  10. iOS开发集成第三方微信支付和分享问题