首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >T9算法太慢

T9算法太慢
EN

Stack Overflow用户
提问于 2016-07-30 21:39:58
回答 1查看 178关注 0票数 0

我正在尝试在我的安卓dialer上实现T9。但它是滞后的。我检查了一下,生成可能的组合列表是很容易的。

但是我正在尝试使用模式进行匹配,我生成的模式如下所示

代码语言:javascript
复制
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);
    }
}

生成的模式如下所示

代码语言:javascript
复制
(?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*)).*
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-31 01:45:57

首先,您应该使用一个字符类,而不是所有这些替换。

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

代码语言:javascript
复制
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,这将产生正则表达式:

代码语言:javascript
复制
[2abc][5klm][2abc][6nop][8uvw][3def][5klm]

这将会比你已经拥有的更快

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38674561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档