私が現在取り組んでいるプログラムでは、少し時間がかかります。基本的には、私はストリングと1つのターゲットフレーズのリストを持っています。例として、ターゲットフレーズが「完成品の在庫」であるとします。ストップワード(of)を除外した後、 "inventory"、 "finished"、 "goods"の3つの単語のいずれかを含むすべての文字列をリストから抽出します。次のように今、私はアイデアを実装:より速い文字列マッチング/反復法?
String[] targetWords; // contains "inventory", "finished", and "goods"
ArrayList<String> extractedStrings = new ArrayList<String>();
for (int i = 0; i < listOfWords.size(); i++) {
String[] words = listOfWords.get(i).split(" ");
outerloop:
for (int j = 0; j < words.length; j++) {
for (int k = 0; k < targetWords.length; k++) {
if (words[j].equalsIgnoreCase(targetWords[k])) {
extractedStrings.add(listOfWords.get(i));
break outerloop;
}
}
}
}
リストは100K以上の単語が含まれており、これでそれは各ターゲットフレーズのためのタスクを完了するためにrounghly 0.4 0.8秒かかります。物事は、私は処理するこれらの目標フレーズの多くを持って、秒が実際に追加されます。したがって、私は誰かがこの作業を完了するためのより効率的な方法を知っているかどうか疑問に思っていましたか?事前に助けてくれてありがとう!
これはO(N^3)です。内部ループの代わりにHashMapを使用することで、O(N^2)に減らすことができます。しかし、私は 'j'のループに困惑しています。なぜあなたの単語のリストはすでに単語のリストではないのですか?なぜあなたはそれぞれのアイテムを再び分割しなければならないのですか? – EJP
申し訳ありませんが、私は変数の名前を変えるべきです - listOfWordsは実際にフレーズを含んでいるので、フレーズを分割して各フレーズの個々の単語を取得します。 – myrocks2