技术领域
[0001] 本
发明涉及一种手持设备高效联系人查找方法,属于信息技术处理领域。本发明可实现手持设备通过直接按数字键对联系人进行查找,同时给出智能查找的匹配结果,以方便使用者继续输入字符进行更准确的查找。
背景技术
[0002] 现今手机行业发展迅猛,手机已成为人们日常生活中不可或缺的一部重要的移动设备。然而受物理尺寸限制,手机制造商往往采用物理数字
键盘以减少键盘占用的空间。还有许多触屏手机提供的虚拟键盘也适用数字键盘的布局,方便用户点击。在数字
键盘输入时,各种语言一般将字母表映射到0-9的十个数字上,通过连续点击数字按键在字母之间切换。还有许多语言(例如汉字)不能通过数字键盘直接输入字符,还需要使用本地的输入法进行一个转换。
[0003] 受此种数字键盘输入方式的影响,基于字母输入的联系人查找也必须多次点击一个数字键选择要输入的字母,然后使用该字母进行对联系人的姓名进行查找。例如在英文环境中查找“Steven”,用户必须连续按四下数字键‘7’选择字母‘S’,输入整个单词需要按十四次按键。数字键盘联系人查找方式严重制约联系人的查找速度。另外,传统的查找方式只会将搜索结果按照联系人的姓名进行排序,如果姓名的前几个字符相同,用户必须输入更多的字符才能准确查找到想要找到的联系人。
发明内容
[0004] 针对
现有技术中存在的技术问题,本发明的目的在于提供一种手持设备高效联系人查找方法。本方案直接采用输入数字对联系人进行查找。查找时,自动根据数字键盘映射将列举出数字对应的可能字母组合,然后使用字母组合对联系人进行过滤;同时还使用输入的数字对联系人的手机号码进行查找。本方案还使用匹配程度和联系
频率对搜索结果进行智能排序,以提高搜索的准确性。搜索结果高亮显示匹配的字母,方便用户继续输入数字或者删除数字进行进一步查找。
[0005] 本发明的技术方案为:
[0006] 一种手持设备高效联系人查找方法,其步骤为:
[0007] 1)建立一字符反查表,用于保存需要转换成字母才能输入的字符;其中,一个字符设置有一个或多个字母拼写串;
[0008] 2)建立一数字键盘映射表,用于保存字母与键盘数字之间的对应关系;
[0009] 3)利用所述字符反查表对通讯录中的联系人姓名进行分解,得到姓名中的标点符号S、连续的字母串L、字符C及其字母拼写串(L1,L2,..,Ln),并将分解结果保存到一链表结构的顺序
节点中;具体方法为:
[0010] 31)获取姓名中每一个字符,如果当前字符是一个字母,将其添加到字母串缓存,否则将已缓存字母作为一个字母串节点,添加到顺序节点中;
[0011] 32)如果当前字符是可拼写的字符,则将当前字符添加到一个字符节点;同时获取当前字符的字母拼写串,并将每一个字母拼写串添加到一个字母串节点;最后将字符节点和字母串节点添加到一个分支节点中,并将该分支节点添加到顺序节点中;
[0012] 33)如果当前字符是无法识别的字符,则将其当作标点符号单独作为一个字符节点添加到顺序节点中;
[0013] 4)利用所述数字键盘映射表对链表中存储的姓名分解结果与用户输入的过滤字符串进行匹配;
[0014] 41)将顺序节点中存储的
子节点依次与用户输入的过滤字符串进行匹配,并记录顺序节点中每一个子节点与过滤串的匹配的状态信息;其中,如果当前子节点是字符节点,则将其存储的字符与过滤串当前字符直接进行比较,如果是字母串节点,则将其存储的字母及字母对应于数字键盘上的数字分别与过滤串当前字符进行比较,如果是分支节点,则将其存储的字符节点或字母串节点与过滤串当前字符进行比较,只要有一个节点匹配成功就认为分支节点与过滤串匹配;
[0015] 42)使用下一个子节点与剩余部分过滤串的字符继续匹配,如果能够匹配到过滤字符串的结尾,则认为本次匹配成功,否则认为本次匹配失败;
[0016] 5)返回包含匹配信息的联系人,得到匹配的联系人列表。
[0017] 进一步的,所述字符反查表的字段包括:文件类型标识、拼写串缓存在文件中的存储起始
位置、字符节点在文件中的存储位置、字符节点个数。
[0018] 进一步的,所述匹配的状态信息包括:子节点在顺序节点中的位置,分支节点的分支位置,子节点与过滤字符串匹配的状态。
[0019] 进一步的,所述字符节点按照字符的Unicode值从小到大排列;采用折半查找方法查找当前字符在所述字符反查表中对应的字母拼写串;将姓名分解结果采用正则文法表示为:SL(C|L1|L2|..|Ln)。
[0020] 进一步的,将匹配联系人中的匹配结果进行高亮显示,并计算匹配准确度,根据匹配准确度对搜索结果排序。
[0021] 进一步的,计算所述匹配准确度的方法为:
[0022] 1)遍历解析后的节点串中每一个节点,如果当前节点匹配就返回匹配精确度为0,否则返回匹配精确度为1;
[0023] 2)将匹配精确度返回值进行累加,累加值愈大则匹配的准确度越低,反之匹配度越高;
[0024] 3)将匹配精确度保存到匹配结果中。
[0025] 进一步的,根据匹配结果对匹配的联系人列表进行排序,其方法为:首先根据匹配精确度对匹配联系人进行升序排序;然后对于匹配精确度相同的联系人根据联系频率进行降序排列,最后对于相同匹配精确度和相同联系频率的联系人根据姓名排序。
[0026] 与现有技术相比,本发明的积极效果为:
[0027] 1.接受用户直接输入数字,使用数字按照键盘映射对联系人查找;
[0028] 2.查找联系人时,除了对姓名查找外还对用户手机号码进行;
[0029] 3.统计查找的匹配准确度,根据匹配准确度和联系频率对过滤后联系人排序;
[0030] 4.高亮显示字母匹配结果,方便用户继续输入;
附图说明
[0032] 图2:使用手机数字键盘联系人查找。
具体实施方式
[0033] 下面结合附图对本发明的具体实施方式进行详细描述,本发明的方法流程如图1所示。
[0034] 1.对于文字中需要转换成字母才能输入的字符,建立字符反查表(SpellTable)。一个字符可能有多个字母拼写串,按照字符排序后存储可以使用折半查找加快查找速度。
对于不需要拼写转化的语言省略此步骤。
[0035] 表格1:字符反查表
[0036]字符1 字母拼写串1
字符1 字母拼写串2
字符2 字母拼写串3
[0037] 建立字符反查表,保存在二进制文件中。文件结构如下:
[0038] 文件头SpellTableFileHead用于识别拼写串缓存位置和字符节点位置和个数。在文件头后面紧接着存储拼写串,然后是存储字符节点(CharNode)。字符节点按照字符的Unicode值从小到大排列,便于使用折半查找。
[0039]
[0040] 2.对字母建立数字键盘映射表(LetterTable),用于数字串和字母串的匹配,多个字母可能对应一个数字。
[0041] 表格2:字母数字键盘映射表
[0042]字母1 数字1
字母2 数字2
字母3 数字3
[0043] 数字键盘的字母比较少,直接使用数组保存,查找可以使用顺序查找。
[0044]
[0045] 3.将联系人姓名分解为标点符号(S)、连续的字母串(L)、字符(C)并读取字符的字母拼写串(L1,L2,..,Ln),使用正则文法表示为:SL(C|L1|L2|..|Ln)。将分解结果存储到链表结构的顺序节点(Sequence)中。联系人电话号码搜索时也可以使用相同的
算法。
[0046] 姓名分解算法如下:
[0047] a.获取姓名中每一个字符
[0048] b.如果是一个字母,将其添加到字母串缓存,如果不是字母将现有的字母缓存作为一个字母串节点,添加到顺序节点(Sequence)中。
[0049] c.如果是可拼写的字符,将该字符添加到一个字符节点。同时获取该字符的字母拼写串,并将每一个字母拼写串添加到一个字母串节点。最后将字符节点和字母串节点添加到一个分支节点中,,并将该分支节点添加到顺序节点(Sequence)中。
[0050] d.将无法识别的字符当作标点符号单独作为一个字符节点添加到顺序节点(Sequence)中。
[0051]
[0052]
[0053] 字符拼写反查使用折半查找
指定字符在字符表数组中的上下边界,将拼写串
指针存贮在参数spells数组中,返回实际的拼写串个数。
[0054]
[0055] 4.使用顺序节点中存储的子节点依次与用户输入的原始过滤字符串进行匹配。字符节点可以直接将其存储字符与过滤串进行比较。字母串节点使用模糊比较算法与过滤串进行比较。分支节点将其存储的字符节点或字母串节点与过滤串进行比较,只要有一个节点匹配成功就认为分支节点与过滤串匹配。匹配过程中记录顺序节点中每一个子节点与过滤串的匹配的状态信息,然后使用下一个子节点与剩余部分过滤串继续匹配。如果能够匹配到过滤字符串的结尾,认为本次匹配成功,否则认为本次匹配失败。
[0056] 4.1 字母串过滤算法:
[0057] a.如果状态大于1,说明已经比较过,但是查询失败,需要回退一个字母再次比较。
[0058] b.如果不是MATCH_INIT(值为-1),说明所有的尝试都告失败。
[0059] c.然后使用模糊匹配算法将字母串与过滤字符串从左向右的每一个字符进行比较。
[0060] d.返回匹配的长度,如果是0表示不匹配。
[0061] //字母串匹配算法:
[0062]
[0063]
[0064] 4.11 字母模糊匹配算法:
[0065] a.如果字母与过滤串字符相等,匹配成功,返回true。
[0066] b.查找字母在数字键盘对应的数字(见4.1.2),如果该数字与过滤字符相等,就认为过滤字符与字母匹配,返回true。
[0067] c.否则认为匹配尝试失败,返回false。
[0068]
[0069] 4.1.2 使用顺序查找算法找到字母在键盘上对应的数字:
[0070]
[0071] 4.2 字符匹配算法:只有第一次匹配且过滤字符与当前字符相等时,认为正确匹配,返回匹配长度1,否则认为匹配失败,返回0。
[0072] int CharBlock::match(const wchar_t*filter,int& state){
[0073] return(state==MATCH_INIT && mChar==*filter)?1:0;
[0074] }
[0075] 4.3 记录节点匹配状态数据包括:子节点在顺序节点中的位置,子节点与过滤字符串匹配的状态(状态大于0时表示匹配的长度)。
[0076]
[0077] 5.获取匹配的结果。如果顺序节点与过滤字符串匹配成功,根据保存的匹配状态数据分别获取字符节点、字母串节点与过滤串的匹配部分的和不匹配部分,以及匹配准确度。
[0078] 获取匹配结果的算法:
[0079] a.如果当前字母串节点与字符串不匹配(state为-1),将整个字母串作为不匹配部分添加到匹配结果。
[0080] b.如果匹配,分别将匹配部分和不匹配部分分别添加到匹配结果。
[0081]
[0082] 将字符节点也添加到匹配结果中。
[0083] void CharBlock::getContent(Result&result,int state)const{[0084] result.append(&mChar,1,state!=MATCH_INIT);
[0085] }
[0086] 获取匹配的精确度:
[0087] a.遍历解析后的节点串(Sequence)的每一个节点,如果当前节点匹配(state>0)就返回0,否则(state==MATCH_INIT)返回1。
[0088] b.将匹配精确度返回值进行累加,累加值愈大就认为匹配的准确度越低,否则就认为匹配度越高。
[0089] c.将匹配精确度保存到匹配结果中。
[0090] //获取匹配的精确度,返回结果越小表示越准确,便于累加统计。
[0091] int LetterBlock::getAccuracy(int state)const{
[0092] return(state==MATCH_INIT);
[0093] }
[0094] 6.智能排序。将过滤结果按照匹配准确度、联系频率、联系人姓名,联系人电话号码四个维度进行排序。联系频率的计算使用累加短信记录个通话记录个数获得。
[0095] 比较两个结果优先级算法如下:
[0096] a.比较是否匹配的是号码,将匹配号码的结果排在匹配姓名结果的后面。
[0097] b.比较匹配度,将值较小的结果排在前面。
[0098] c.比较联系频率,将值较大的排在前面。
[0099] d.最后比较姓名,字符按照其第一个拼写字母串参与比较,不能获取拼写串的字符使用其Unicode值进行比较。
[0100]
[0101]
[0102] 7.高亮显示匹配结果。将联系人姓名过滤结果的匹配部分高亮显示出来,方便用户继续输入字符或数字进一步过滤。
[0103]
[0104] 图2是采用本发明方法进行联系人查找过程的一具体实例。
[0105] 关键字
[0106] 字母:letter,可布局到数字键盘,可以连续点击数字进行输入。
[0107] 字符:character,本文中的“字符”指文字中不能通过键盘直接输入,但可以转换成特定的字母串进行输入,需要输入法支持。如中文中的汉字。
[0108] 字母拼写串:spell,输入字符需要的特定字母序列。如汉字中的拼音、笔画、注音、仓颉,日语中的
假名读音等。