2016-07-30 76 views
-2

我想实现T9到我的android dialer。但它滞后。我检查并生成可能的组合列表是无痛的。T9算法太慢

但我想用一个模式来匹配和我产生的模式如下

Pattern queryPattern; 
List<String> names = T9Utils.possibleNames(query); 
StringBuilder sb = new StringBuilder(); 
for (String name : names) { 
    Matcher m = p.matcher(name.toLowerCase()); 
    sb.append("("); 
    sb.append(m.replaceAll("($0)\\s*")); 
    sb.append(")"); 
    if (!name.equals(names.get(names.size() - 1))) { 
     sb.append("|"); 
    } 
} 
queryPattern = Pattern.compile("(?i).*(" + sb.toString() + ").*"); 
for (CallLogItem contact : allContacts) { 
    Matcher nameM = queryPattern.matcher(contact.displayName); 
    Matcher phoneM = queryPattern.matcher(contact.phoneNumber); 

    if (nameM.matches()) { 
     //TODO: Highlighting 
     toBeDisplayed.add(contact); 
    } else if (phoneM.matches()) { 
     toBeDisplayed.add(contact); 
    } 
} 

产生会像

(?i).*(((g)\\s*(d)\\s*)|((g)\\s*(e)\\s*)|((g)\\s*(f)\\s*)|((g)\\s*(3)\\s*)|((h)\\s*(d)\\s*)|((h)\\s*(e)\\s*)|((h)\\s*(f)\\s*)|((h)\\s*(3)\\s*)|((i)\\s*(d)\\s*)|((i)\\s*(e)\\s*)|((i)\\s*(f)\\s*)|((i)\\s*(3)\\s*)|((4)\\s*(d)\\s*)|((4)\\s*(e)\\s*)|((4)\\s*(f)\\s*)|((4)\\s*(3)\\s*)).* 
+0

为什么我下投得更快!告诉我,让我下次更好! –

回答

2

一是该模式,你应该使用一个字符类代替所有这些变化。

然后删除您比较的字符串的空格。以你的名字为例:Amanuel Nega =>AmanuelNega。你应该使用这个转换表(根据需要适应吧):

Input | Corresponding class 
--------------------------- 
1  | [1.!] 
2  | [2abc] 
3  | [3def] 
4  | [4ghi] 
5  | [5klm] 
6  | [6nop] 
7  | [7qrst] 
8  | [8uvw] 
9  | [9xyz] 
0  | [0+] 

比方说,我键入4后跟一个3(这是你的输出有什么建议)。

然后输出将是[4ghi][3def]

如果我想匹配AmanuelNega我必须键入2526835将产生正则表达式:

[2abc][5klm][2abc][6nop][8uvw][3def][5klm] 

这将是waaaay比你已经拥有

+0

谢谢......我怎么没有想到这一点! –