对某个集合范围内的词组,例如公司内所有职员姓名做自动完成,例如黄海晏,输入hhy,huanghy,hhaiy,hhyan,皆能匹配到。

算法代码:

/** * 不完整拼音匹配算法,可用到汉字词组的自动完成 * 拼音搜索匹配 huang hai yan => huhy,hhy * 通过递归方法实现 * * @param search 输入的拼音字母 * @param pinyin 汉字拼音数组,通过pinyin4j获取汉字拼音 @see http://pinyin4j.sourceforge.net/ * @return 匹配成功返回 true * @author 黄海晏 */ public static boolean distinguish(char[] search, int searchIndex, String pinyin[], int wordIndex, int wordStart) { if (searchIndex == 0) return search[0] == pinyin[0].charAt(0) &&//第一个必须匹配 (search.length == 1 || distinguish(search, 1, pinyin, 0, 1));//如果仅是1个字符,算匹配,否则从第二个字符开始比较 if (pinyin[wordIndex].length() > wordStart//判断不越界 && search[searchIndex] == pinyin[wordIndex].charAt(wordStart))//判断匹配 return searchIndex == search.length - 1 ? distinguish(search, pinyin, wordIndex)//如果这是最后一个字符,检查之前的声母是否依次出现 : distinguish(search, searchIndex + 1, pinyin, wordIndex, wordStart + 1);//同一个字拼音连续匹配 else if (pinyin.length > wordIndex + 1 //判断不越界 && search[searchIndex] == pinyin[wordIndex + 1].charAt(0)) //不能拼音连续匹配的情况下,看看下一个字拼音的首字母是否能匹配 return searchIndex == search.length - 1 ? distinguish(search, pinyin, wordIndex) //如果这是最后一个字符,检查之前的声母是否依次出现 : distinguish(search, searchIndex + 1, pinyin, wordIndex + 1, 1);//去判断下一个字拼音的第二个字母 else if (pinyin.length > wordIndex + 1)//回退试试看 对于zhuang an lan searchIndex > 1 && for (int i = 1; i < searchIndex; i++) if (distinguish(search, searchIndex - i, pinyin, wordIndex + 1, 0)) return true; return false; } /** * 辅佐函数,确保pinyin[n].charAt(0)(n<=wordIndex)都按顺序依次出现在search里面 * 防止zhou ming zhong匹配zz,跳过了ming * * @param search * @param pinyin * @param wordIndex 已经匹配到拼音索引 * @return 都按顺序依次出现了,返回true */ private static boolean distinguish(char[] search, String pinyin[], int wordIndex) { String searchString = new String(search); int lastIndex = 0; int i = 0; for (i = 0; i < wordIndex; i++) { lastIndex = searchString.indexOf(pinyin[i].charAt(0), lastIndex); if (lastIndex == -1) return false; lastIndex++; } return true; } //test public static void main(String[] args) { String pinyin[]={"zhuang","an","lan"}; boolean b = distinguish("zal".toCharArray(), 0,pinyin, 0, 0); System.out.println("zal = " + b); b = distinguish("zhuanganl".toCharArray(), 0,pinyin, 0, 0); System.out.println("zhuanganl = " + b); b = distinguish("zhuananl".toCharArray(), 0,pinyin, 0, 0); System.out.println("zhuananl = " + b); b = distinguish("zhuanl".toCharArray(), 0,pinyin, 0, 0); System.out.println("zhuanl = " + b); b = distinguish("zhl".toCharArray(), 0,pinyin, 0, 0); System.out.println("zhl = " + b);//false,非连续匹配,跳过了安 }

不完整拼音模糊匹配算法相关推荐

  1. 使用完整拼音查找汉字(完整拼音,不是网上散布的首字符拼音那种方法)

    注意:这绝不是网上散播的只能使用拼音首字符进行汉字查找的方案,这是一个真正的输入完整拼音得到相应汉字的解决办法. 大部分程序员眼中只有变量.函数--他们忽略生活中的一切,他们并不理解真正的优雅的程序解 ...

  2. 中文拼音模糊查询的一种解决方法

    目前在ASP.Net平台下中文拼音模糊查询的方法有好几种.不外乎都是把拼音的码放到数据库里. 今天发现另一种解决的办法.网上有人把拼音码做成SQL Server的PLUGIN,通过存储过程来调用. 支 ...

  3. 一句话系列:姓名模糊匹配算法

    一句话系列:姓名模糊匹配算法 关键点:使用相同字符做切片,根据切片结果,进行匹配(split) 功效: 对中文姓名进行模糊匹配 import re list_ = [("赵紫斌", ...

  4. 【Python处理EXCEL】轻办公实用篇1:通过模糊匹配算法对两个excel表格的内容进行匹配归类

    目录 一.问题描述 二.运用方法 三.代码编写 3.1 3.2 3.3 3.4 3.5 四.代码集合 一.问题描述 在实习的时候,需要将两个表格的内容进行匹配分类,比如两个不同的工程项目针对的对象都是 ...

  5. java 拼音模糊查询_java实现首字母模糊查询的功能

    ①,要实现首字母模糊匹配,首先我们需要得到你要搜索内容的首字母,对于java来说,有一个非常实用的包:pinyin4j.jar. 这个拼音包中的PinyinHelper 方法可以得到String的首字 ...

  6. php拼音模糊查询,PHP模糊查询技术实例分析【附源码下载】

    本文实例讲述了PHP模糊查询技术.分享给大家供大家参考,具体如下: 简介 从本质上揭密PHP模糊查询技术 功能 根据输入的关键字查找相关用户 PHP用户查询器案例分析 课程目标 掌握PHP模糊技术的应 ...

  7. php中文拼音模糊,两种php中文字符转拼音问题解决方法

    最近在做二次开发的时候,碰到了将数据库中存储的某个字段的值(该值为中文字符串)分别归类到相应字母下的问题,如:"博客"归类到B中. 解决该问题的思路为:      1.读取改字段的 ...

  8. mysql 拼音查询_mysql中文字段转拼音首字母,以及中文拼音模糊查询

    创建存储过程,将中文字段转拼音首字母 CREATE DEFINER=`root`@`%` FUNCTION `fristPinyin`(P_NAME VARCHAR(255)) RETURNS var ...

  9. 按拼音模糊匹配查询条件的生成类

    转载了好几个地方,很难确定最早的出处. 将源码贴出来先.  1using System;   2using System.Text;   3using System.IO;   4  5namespa ...

最新文章

  1. 迁移学习——使用Tensorflow和VGG16预训模型进行预测
  2. location.hash属性介绍
  3. capistranorb
  4. PHP扩展-扩展的生成和编译
  5. 目标检测之---R-FCN and R-FCN-3000
  6. UVA 11210 中国麻将
  7. 机器学习中的算法-支持向量机(SVM)基础
  8. sql GROUP BY子句使用实例
  9. 机器人当中的摩擦力(未完)
  10. 【动态规划】ST算法解决区间最值询问问题(RMQ问题)
  11. 阿斯克码表ACSII对照表
  12. Electron 使用Widevine CDM插件
  13. WiFi之SDIO接口
  14. 让对应背景随着轮播的图片变化而改变
  15. 深扒Mobileye—与特斯拉分手,被英特尔收购,现在又成了蔚来的救星?
  16. 微信公众号发红包 php,php微信公众号开发之现金红包
  17. 计算机说课教案模板,说课稿通用模板
  18. ireport oracle,用ireport调用oracle存储过程
  19. linux 搜狗不能打中文,linux下搜狗输入法不能输入中文的解决方案
  20. 用心行走——《做最好的新教师》读后感3200字

热门文章

  1. java实现头像上传 前后端
  2. WI-FI LOGO认证学习记录
  3. vmwaretools与open-vm-tools都无法使用的解决方法
  4. 虚拟化技术加速Android模拟器尝试
  5. 拷贝pdf中的表格数据
  6. 数学推导+纯Python实现机器学习算法14:Ridge岭回归
  7. windows7快捷键-好玩的
  8. 偏振光及其在摄影上的应用
  9. uni-app嵌入其他页面(阿里邮箱为例)
  10. WinRAR实用技巧:一个设置,可能让多文件压缩变得更小!