2017-01-03 4 views
0

カスタムAndroid IMEのオートコンプリート/スペルチェッカークラスを作成しています。これはかなりうまくいっています。私はMatcher.find()を使って "辞書"オブジェクトを検索しています。私は現在、Googleから15k単語の単語リストを使用しています。Java Matcher.find()は時々動作しますが、火曜日の昼食後のみ

このtxtファイルを取り出して、セクション(A〜Z)に分割して、チェックされている文字列の最初の文字を使用して検索処理を高速化しました。 txtファイルはアセットからハッシュマップに読み込まれ、これらのすべてがうまくいきます。

私は、正規表現の式を使用します。このツールを使用して、

private void findAutoCompletes(String word) { 
    setAlphaDictionary(Character.toUpperCase(word.charAt(0))); 
    ArrayList<String> autoCompleteList = new ArrayList<>(); 

    String patternString = "\\b(" + word + ")"; 
    Pattern pattern = Pattern.compile(patternString, Pattern.CASE_INSENSITIVE); 
    Matcher matcher = pattern.matcher(alphaDictionary); 

    while(matcher.find()) { 
     String autoCompleteWord = pullStringFromDictionary(matcher.start()); 

     //if currentlyCheckAgainstList does not contain the word, add it to the autoCompleteList 
     if (!autoCompleteWord.isEmpty()) { 
      if (!currentlyCheckingAgainstList.contains(autoCompleteWord)) { 
       currentlyCheckingAgainstList.add(autoCompleteWord); 
      } 
     } 
    } 
} 

しかし、これは常に何それが必要戻りません:

String patternString = "\\b(" + word + ")"; 

全体の機能は、このように見ているのRegexPlant Iいくつかのテストを行った。 \ b(we)を正規表現として使用し、テストされる文字列として[were、where、website、webcast、wendy]を使用しました。これらの単語は私の辞書のテキストファイルから取られました。何か不足していますか?私はまだAndroid開発にはまだまだ新しく、数年(3〜4)はJavaを使用していないため、このプロジェクトまではWeb開発とiOS開発に取り組んできました。

誰かが私を正しい方向に向けることができたら、私はとても感謝しています。

編集:これは必ずしもそうではないことを付け加えたいと思います。それは "まばゆい"と思われる。ほとんどの場合、私は "病気"とタイプすることが期待される結果を得る[違法、病気、illnois]。

+0

あなたの例では、これらの4つの単語( 'あった、ウェブサイト、ウェブキャスト、ウェンディー)を返すかどうかを指定しますか? ( ''はどんな場合でも返されるべきではありません) – leeyuiwah

+1

あなたは問題をきちんと説明していません。予期しない結果が出ていますか?どんな状況下で?期待された結果は何でしたか?あなたはデバッグを試みましたか? – shmosel

+0

申し訳ありませんが、私はそれをより明確にすべきでした。私は返される場所が欲しくない。テストでは、式にfalseが返ってくることを確認するために使っていました。私が推測するコントロールグループのようにxD –

答えて

3

お試しString patternString = "\\b(" + word + "\\w*)";うまくいくはずです。ちょうどregex101.comでテストされています。括弧の中の\w*は、検索語だけでなく、単語全体が一致するようにします。 wordで始まり、0文字以上のアルファベットが続く単語に一致します。

+1

これは私の考えでした。これがうまくいけば、単語全体は 'matcher.group()'に含まれます - それを検索する特別なメソッドは必要ありません。 (また、文字列リテラルに '' \\ w *) '')が2つ必要です。 –

+0

@AlanMooreあなたが正しいです、私はバックスラッシュを '" \ w *) "'でエスケープするのを忘れていました。一定。 –

+1

このパターンをありがとう!それは魅力のように機能します! –

関連する問題