4

文字列の配列String[] wordsと 28000 語の単語リストがあります。

文字列配列のメンバーが WordList にあるかどうかを確認したい (単語リストはテキスト ファイル wordlist.txt にあります)

これを行う最も効率的な方法は何ですか?

4

8 に答える 8

9

HashSet<String>文字列を配列ではなくに直接配置containsし、セットを使用してファイルを反復処理して内容を確認します。O(1) アクセスを改善することはありません。Stringsこれにより、重複が存在する場合の保存に使用されるメモリも最小限に抑えられます。

于 2013-09-06T12:54:27.163 に答える
1

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;
            }
        }
    }
于 2013-09-06T13:03:11.550 に答える
0

HashSet文字列の を次のように作成します。

HashSet<String> wordSet = new HashSet<String>(Arrays.asList(words));

そして、 HashSet.contains(Object o)メソッドでチェックインします。どこwordHashSet、存在するかどうかをチェックしたい単語があります。word

于 2013-09-06T13:03:42.033 に答える
0

元の words.txt の代わりにシリアライズされた HashSet を保存します。アプリケーションの実行とは別のステップとして。

その後、アプリケーションはハッシュ セットを 1 回ロードするだけで済みます。

于 2013-09-06T13:05:05.183 に答える
0

HashSet単語がセット内に既に存在する場合、 'sadd()は false を返します。

for (String str : words) {
  if (!wordSet.add(str)) {
    System.out.println("The word " + str + " is already contained.");
  }
}

これは よりも少し洗練されており、低レベルではありませんcontains()

于 2013-09-06T13:05:51.490 に答える
0

HashSet<String>or ArrayList<String>which hascontainsメソッドを使用できます。文字列が保存されているかどうかを確認します。とis hashset
の違いは、値の重複を許可せず、順序を維持しませんが、arraylist では重複とその順序付けられたコレクションを許可します。ただし、検索操作を実行するには、HashSet の方が arraylist よりも効率的です。HashSetArrayList

于 2013-09-06T12:57:46.640 に答える
0

単語のリストがメモリに収まる場合は、HashSet で十分です。

メモリ サイズが問題になる場合は、BloomFilterを使用します。ブルーム フィルターが間違った答えを返す可能性はありますが、その確率を調整することができます。

于 2014-03-31T09:36:36.857 に答える