1

問題の説明


8000 項目を含む文字列のリストがあります。リストを含む項目について以下に説明します。

List<String> stringList = new List<String>(8000);
stringList.add("this is first string.");
stringList.add("text which I want to search.");
stringList.add("separated string items.");
....

リスト内のすべての項目が 3 つ以上の単語を含む文であることがわかります。

質問。


外部からのユーザーは、次の方法でリストを検索できます。たとえば、ユーザーが「最初に」単語を検索したい場合、検索アルゴリズムはこのように機能する必要があります。

検索アルゴリズムはリストを実行し、単語 " first " を文内のすべての単語と比較する必要があり、文内の単語が " first " で始まる場合は、その文を返す必要があります ". したがって、このアルゴリズムを実現するために、次のコードを記述します。以下のコードを見ることができます。

私が実装するアルゴリズムは非常に遅いので、より高速なアルゴリズムがあるかどうか、またはアルゴリズムを高速化する方法を知りたいですか?

コード例


Iterator<ContactInformation> stringListIter  = stringList .iterator();
while (stringListIter.hasNext()) {
            
    String currItem = stringListIter.next();
    String[] separatedStr = currItem.split(" ");

    for(int i=0; i<separatedStr.lenght; ++i)
        if(separatedStr[i].startsWith(textToFind))
            retList.add(currItem);  
}
4

4 に答える 4

2

Map<String, Set<Integer>>すべての単語がキーで、値がこの単語を含む文のインデックスであるa を保持します。

于 2013-05-02T07:34:42.850 に答える
2

各トークンを分割して検索する代わりに、このString#containsメソッドを使用できます。String#startsWithString

String currItem = stringListIter.next();
if(currItem.startsWith(textToFind.concat(space))){
    retList.add(currItem);
} else if(currItem.endsWith(space.concat(textToFind))){
    retList.add(currItem);
} else if(currItem.contains(space.concat(textToFind).concat(space))){
    retList.add(currItem);
} else if(currItem.equals(textToFind)){
    retList.add(currItem);
}

First if- 最初の単語かどうかをチェックします。

Second if- 最後の単語かどうかをチェックします。

3 番目if- 中間にあるかどうかを確認します。

Last if- 唯一の単語かどうかをチェックします。

于 2013-05-02T07:35:42.533 に答える
1

ルセンにぴったりの仕事。

于 2013-05-02T07:55:44.700 に答える