不完整拼音模糊匹配算法
对某个集合范围内的词组,例如公司内所有职员姓名做自动完成,例如黄海晏,输入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,非连续匹配,跳过了安 }
不完整拼音模糊匹配算法相关推荐
- 使用完整拼音查找汉字(完整拼音,不是网上散布的首字符拼音那种方法)
注意:这绝不是网上散播的只能使用拼音首字符进行汉字查找的方案,这是一个真正的输入完整拼音得到相应汉字的解决办法. 大部分程序员眼中只有变量.函数--他们忽略生活中的一切,他们并不理解真正的优雅的程序解 ...
- 中文拼音模糊查询的一种解决方法
目前在ASP.Net平台下中文拼音模糊查询的方法有好几种.不外乎都是把拼音的码放到数据库里. 今天发现另一种解决的办法.网上有人把拼音码做成SQL Server的PLUGIN,通过存储过程来调用. 支 ...
- 一句话系列:姓名模糊匹配算法
一句话系列:姓名模糊匹配算法 关键点:使用相同字符做切片,根据切片结果,进行匹配(split) 功效: 对中文姓名进行模糊匹配 import re list_ = [("赵紫斌", ...
- 【Python处理EXCEL】轻办公实用篇1:通过模糊匹配算法对两个excel表格的内容进行匹配归类
目录 一.问题描述 二.运用方法 三.代码编写 3.1 3.2 3.3 3.4 3.5 四.代码集合 一.问题描述 在实习的时候,需要将两个表格的内容进行匹配分类,比如两个不同的工程项目针对的对象都是 ...
- java 拼音模糊查询_java实现首字母模糊查询的功能
①,要实现首字母模糊匹配,首先我们需要得到你要搜索内容的首字母,对于java来说,有一个非常实用的包:pinyin4j.jar. 这个拼音包中的PinyinHelper 方法可以得到String的首字 ...
- php拼音模糊查询,PHP模糊查询技术实例分析【附源码下载】
本文实例讲述了PHP模糊查询技术.分享给大家供大家参考,具体如下: 简介 从本质上揭密PHP模糊查询技术 功能 根据输入的关键字查找相关用户 PHP用户查询器案例分析 课程目标 掌握PHP模糊技术的应 ...
- php中文拼音模糊,两种php中文字符转拼音问题解决方法
最近在做二次开发的时候,碰到了将数据库中存储的某个字段的值(该值为中文字符串)分别归类到相应字母下的问题,如:"博客"归类到B中. 解决该问题的思路为: 1.读取改字段的 ...
- mysql 拼音查询_mysql中文字段转拼音首字母,以及中文拼音模糊查询
创建存储过程,将中文字段转拼音首字母 CREATE DEFINER=`root`@`%` FUNCTION `fristPinyin`(P_NAME VARCHAR(255)) RETURNS var ...
- 按拼音模糊匹配查询条件的生成类
转载了好几个地方,很难确定最早的出处. 将源码贴出来先. 1using System; 2using System.Text; 3using System.IO; 4 5namespa ...
最新文章
- 迁移学习——使用Tensorflow和VGG16预训模型进行预测
- location.hash属性介绍
- capistranorb
- PHP扩展-扩展的生成和编译
- 目标检测之---R-FCN and R-FCN-3000
- UVA 11210 中国麻将
- 机器学习中的算法-支持向量机(SVM)基础
- sql GROUP BY子句使用实例
- 机器人当中的摩擦力(未完)
- 【动态规划】ST算法解决区间最值询问问题(RMQ问题)
- 阿斯克码表ACSII对照表
- Electron 使用Widevine CDM插件
- WiFi之SDIO接口
- 让对应背景随着轮播的图片变化而改变
- 深扒Mobileye—与特斯拉分手,被英特尔收购,现在又成了蔚来的救星?
- 微信公众号发红包 php,php微信公众号开发之现金红包
- 计算机说课教案模板,说课稿通用模板
- ireport oracle,用ireport调用oracle存储过程
- linux 搜狗不能打中文,linux下搜狗输入法不能输入中文的解决方案
- 用心行走——《做最好的新教师》读后感3200字