2016-06-01 2 views
0

Javaで単語ゲームを作成しようとしました。これは、テキストファイル(.txt)を主要な辞書、正確には英語に置き換えます。Javaで単語ゲームを作成する(辞書ファイルの構成に関する問題)

この辞書には約85,000語が含まれています。

私はユーザーからの入力が必要で、辞書に入っているかどうかを確認します。そうであれば、ユーザーはポイントを取得します。

しかし、問題がある、

  1. は私が辞書に85,000単語を取り、"Hashmapsに保存しますか?
  2. 私は、ユーザーが入力した文字列が辞書の内部にあり、それに対する賞のポイントがあるかどうかを確認する方法はありますか?

これに関する入力はありますか?

+0

同様のケースではNavigableSetを使用しています。 – Ozgur

答えて

2

すべての85,000語をHashSetにロードし、containsを使用してチェックすることをお勧めします。

Set<String> knownWords = new HashSet<>(); 
// Populate the set 
... 
// Check with 
knownWords.contains(userInput); 

でも安くアンドロイドは、一般的には、(最大で3メガバイトの周りになります)のセットを処理できる必要がありますメモリの少なくとも半分ギガバイトを持っています。 Java HashSetは検索時に非常に効率的であるため、チェック自体が高速になるはずです。

メモリ消費量をさらに減らすには、各単語の短いハッシュを計算し、辞書を複数のファイルに分割することを検討してください。次に、ユーザーが単語を入力すると、入力の同じハッシュを計算し、そのファイルをメモリー内のセットにロードし、同じcontainsメソッドを使用して評価します。

(辞書とユーザー入力の両方を小文字にすることを忘れないでください)

+0

代わりに配列リストを使用できますか?辞書の単語を内部に格納してから//チェックしてください// knownWords.contains(userInput);で確認してください。 – Lexyblazy

+0

あなたはそうすることはできません。 HashSet#containsをチェックすることは本質的に一定の時間の操作(よく振る舞うハッシュ関数を前提とする)ですが、リストではリスト全体を繰り返して単語が存在するかどうかを調べなければなりません。順序付けされたリストを使用すると、それをO(log n)に改善できますが、HashSetを使用するにはまだまだ高速です。別のケースがある場合は、順番に反復する必要がある場合は、順序付きイテレータ(具体的には、配置された順序で要素を返すもの)を提供するLinkedHashSetのようなものを使用することを検討してください。 – jvalli

関連する問題