文字列の配列String[] words
と 28000 語の単語リストがあります。
文字列配列のメンバーが WordList にあるかどうかを確認したい (単語リストはテキスト ファイル wordlist.txt にあります)
これを行う最も効率的な方法は何ですか?
文字列の配列String[] words
と 28000 語の単語リストがあります。
文字列配列のメンバーが WordList にあるかどうかを確認したい (単語リストはテキスト ファイル wordlist.txt にあります)
これを行う最も効率的な方法は何ですか?
HashSet<String>
文字列を配列ではなくに直接配置contains
し、セットを使用してファイルを反復処理して内容を確認します。O(1) アクセスを改善することはありません。Strings
これにより、重複が存在する場合の保存に使用されるメモリも最小限に抑えられます。
Step1:文字列配列を使わない HashSet を使用する代わりに。
ステップ 2: ファイル (wordlist.txt) の内容を別の HashSet にロードする
ステップ3:
Set<String> set1 = new HashSet<String>(); //Load the string array into set
Set<String> set2 = new HashSet<String>(); //load the file contents into set
for (String str : set1) {
for (String str2 : set2) {
if (str.equalsIgnoreCase(str2)) {
break;
}
}
}
HashSet
文字列の を次のように作成します。
HashSet<String> wordSet = new HashSet<String>(Arrays.asList(words));
そして、 HashSet.contains(Object o)メソッドでチェックインします。どこword
にHashSet
、存在するかどうかをチェックしたい単語があります。word
元の words.txt の代わりにシリアライズされた HashSet を保存します。アプリケーションの実行とは別のステップとして。
その後、アプリケーションはハッシュ セットを 1 回ロードするだけで済みます。
HashSet
単語がセット内に既に存在する場合、 'sadd()
は false を返します。
for (String str : words) {
if (!wordSet.add(str)) {
System.out.println("The word " + str + " is already contained.");
}
}
これは よりも少し洗練されており、低レベルではありませんcontains()
。
HashSet<String>
or ArrayList<String>
which hascontains
メソッドを使用できます。文字列が保存されているかどうかを確認します。とis hashset
の違いは、値の重複を許可せず、順序を維持しませんが、arraylist では重複とその順序付けられたコレクションを許可します。ただし、検索操作を実行するには、HashSet の方が arraylist よりも効率的です。HashSet
ArrayList
単語のリストがメモリに収まる場合は、HashSet で十分です。
メモリ サイズが問題になる場合は、BloomFilterを使用します。ブルーム フィルターが間違った答えを返す可能性はありますが、その確率を調整することができます。