0

T9 を Androidダイヤラーに実装しようとしています。しかし、それは遅れます。私が確認したところ、可能な組み合わせのリストを生成するのは簡単です。

しかし、パターンを使用して一致させようとしており、次のようにパターンを生成しました

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*)).*
4

1 に答える 1

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入力した後に aを入力したとしましょう3(これは出力が示唆するものです)。

その後、出力は になります[4ghi][3def]

一致させたい場合は、次のAmanuelNegaように入力2526835して正規表現を生成する必要があります。

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

これは、あなたがすでに持っているものよりも速くなります

于 2016-07-30T17:45:57.193 に答える