拨号盘匹配联系人

很多软件如ex拨号、qq通讯录都有类似功能
一:拼音首字母匹配联系人



二:拼音匹配联系人



三:号码匹配联系人



这里简单说下注意要点和算法思路吧

匹配规则,这里有三种,分别是联系人拼音匹配,联系人拼音首字母匹配,联系人号码匹配。其中联系人拼音首字母匹配只要匹配的字符串为拼音首字母中的子字符串即可,二拼音匹配除了符合是其子字符串外还需符合子字符串首字母为,汉字中的拼音首字母。如王小明(wangxiaoming)可匹配 wangx、xiaomin、等,但不匹配angxiao、iaoming。号码匹配较简单,也只需符合子字符串即可。

算法思路:
1,首先是将所有联系人的信息加载到内存,为了显示与数据库内容一致可在onresume时候读取,若不严格要求内容一致可在,onstart时候读取,需要的数据有、联系人id,名字、号码、头像(可选)。
2,将数字键盘输入的数字组合,转化成用于匹配的字母串数组
3,循环所有联系人与字母串数组进行三种匹配,若符合将其加入到,用于显示的结果集合中
4,取三种结果集的并集(其实只需一个集合,既匹配过程中已有集合在里面便不再加入结果集)
5,ListView更新自定义Adapter,主要重点是,显示加亮名字,号码,字段。用SpannableString辅助

这里在说第二步,数字组合如何转换成字母串数组。我们知道数字键对应的英文字母是这样的:2(ABC),3(DEF),4(GHI),5(JKL),6(MNO),7(PQRS),8(TUV),9(WXYZ)
可以看到一个数字对应的字母数为3-4,我们以3为准,2个数字键对应的字母串组合3*3 = 9
以此类推可知,字母串数与数字数的关系为 3的n次方,算法复杂度上来数这是个极差的效率。只要超过十几位便是天文数字,所以必须优化。我们采用:不符去除,逐级相乘的办法。例如输入23后有匹配数据的字母串组合有{AD,BE},那么当我们输入第三个数字键时,字母串组合只有2*3个,进行匹配后,再除去不符合的字母串组合。依次下去,便可,得到较少字母串组合数。但只有这样还不够,因为还有一个特殊的键,删除键。所以我们需要有一个栈,用于保存之前符合匹配的字母串。输入数字键,时候推入栈顶,输入删除键时候推出该字母串组合。

转载请注出处

猜你喜欢

转载自qa22qa22.iteye.com/blog/1631270