2012-03-12 5 views
-2

文字列を一致させる文字列の数をn個の文字列と比較する最も速い方法は誰にも分かりますか?Javaのn個の文字列を比較する

例:単語 "例"は、一致のためにnワード数を含むリストと比較する必要があります。リストには、任意の長さの任意の数の単語を含めることができます。

これを行うために使用できる特定のアルゴリズムはありますか?私は、Boyer-Mooreアルゴリズムのような文字列内の部分文字列を見つける文字列一致アルゴリズムを知っています。しかし、これのためではありません。ここで私を助けてください。 Javaでこれを実装することに注意してください。

+0

単語リストはどのような方法でソートされていますか?さもなければ、あなたはループの中でそれらのそれぞれについてBoyer-Mooreをしなければなりません。 – Thilo

+1

どのような種類のマッチですか?答えでは、 "一致"とは、例えば部分文字列ではなく、 "完全に同じ文字列を見つける"という意味です。 – Thilo

+0

とにかく文字列がソートされていません。そうですね、正確に一致するようにしようとしています(大文字と小文字は区別されません)。 –

答えて

0

同じハッシュコードを持つすべての文字列を含みます。

次に、新しい文字列のハッシュコードを検索し、返されたリストの各文字列でequals()を実行します。

比較するエントリーの数がはるかに少なくなるはずです。準備には時間がかかりますので、複数回行う必要がある場合にのみ実行してください。

+0

大文字と小文字を区別しない一致のためにこの作業を行う方法を説明してください(質問のコメントを参照)。 – Thilo

+0

文字列を小文字にしても意味がある場合は、処理する前に小文字にします。 –

3

containsメソッドを使用できます。

List<String> lstr = Arrays.asList(new String[]{"a", "b", "c", "d", "e"}); 
Collections.sort(lstr); 

lstr.contains("c"); // true 
lstr.contains("f"); // false 
+0

大文字と小文字を区別しない一致質問)。 – Thilo

2

ランリストの最後までループとequalsを使って各要素を比較する()キーが文字列とリストのため.hashcode()ここであなたのリストについては、Map<Int,List<String>>を準備することができます方法

+1

+1またはこの場合はIgnoreCaseと等しいです。また、最初の試合で出てくる可能性もあります。 – Thilo

0

正確に一致するかどうかを確認したい場合は、辞書のハッシュマップを維持して単語のハッシュを検索するか、http://en.wikipedia.org/wiki/Trieのようなツリーを使用して各ノードを手紙にします。

両方とも単語の数に比べてほぼ一定の時間の複雑さを持ち、あなたが探している単語の長さに依存します(重要ではありません)。

+0

同じリストに対して複数回これを行う必要があると仮定します。 – Thilo