1

この小さなプロジェクトを完了するために助けが必要です

プログラムは電話番号を入力として受け取り、それを適切な英語の単語に変換します。

説明:最初の10行のテキストファイルに保存されている0〜9の数字に関連する文字がいくつかあります。

1 akl
2 dgh
3 qnm
4 rtu
5 zx
6 cvf
7 eip
8 wjs
9 yb
0 o

行番号11には、単語の総数が存在します。つまり、その後50000になり、行番号12からはすべての50000単語が存在します。1行に1語。これで、プログラムは、ユーザーが-1を入力するまで、入力フォームユーザーとして数値を受け取ります。

次に、このテキストファイルから適切な英語の一致する単語を生成します。各文字はリストの数字を表します。

たとえば、ユーザーは6182703と入力します

出力は次のようになります:ファッション

一致する単語が複数ある場合、システムはハイフン'-'で区切られたすべての単語を一覧表示します。

これをどのように開始すればよいですか、どのようなアプローチを使用する必要がありますか?誰かが擬似コードやヒントを与えたら..それは本当に素晴らしいでしょう。

4

2 に答える 2

2

単語の辞書を用意して、必要に応じてファイルに並べ替えます。

例えば:

リンゴ = 17717

チェリー = 627449

次に、検索アルゴリズムを使用してファイルを調べます。

編集: または、データをリレーショナル DB (http://hsqldb.org/ は単純です) に格納して、メモリ フットプリントが大きくならないようにすることもできます。ソリューションが気に入った場合は、いくつかのキー/値ストアなどを調査することもできます。

于 2012-09-25T06:24:43.733 に答える
2

あなたの質問の詳細の多くは、入力仕様に関連していますが、これはすべて非常に些細なことです。

入力を解析すると、「候補」の単語 (すべての単語) のリストと、それを表すことができる文字セットへの数字のマッピングが得られます。

List<String> words;
Map<Character, Set<Character>> digitMapping;

数字の単語を生成する最も簡単な方法は、おそらく次のとおりです。候補のリストを順次フィルタリングし、入力数字と一致するかどうかをテストし、一致しない場合は削除します。このような何かがうまくいくかもしれません(この疑似コードを考えてください-私はそれをコンパイルしようとはしていません):

List<String> getMatches(String inputDigits) {
    // Take a copy of the word list.  You don't want to ruin the list for the next caller
    List<String> candidates = new ArrayList<String>(words); 

    for (Iterator<String> it = candidates.iterator(); it.hasNext() && !candidats.isEmpty(); ) {
        String candidate = it.getNext();
        for (int i = 0; i < inputDigits.length; ++i) {
            Character c = new Character(candidate.charAt(i));
            Character d = new Character(inputDigits.charAt(i));
            if (!digitMapping.get(d).contains(c)) {   
                it.remove();
            }
         }
     }

     return candidates;
}

一致するすべての単語が返されるため、この例では、「555」は空のリストを返す可能性があります。「6182703」は「ファッション」という 1 つの単語のみを返す場合がありますが、「202」はリスト内の複数の単語 (「犬」、「豚」、「神」) を返す場合があります。ゼロおよび複数のケースをどのように処理するかを決定する必要があります。

編集: digitMapping の入力に関する詳細:

digitMapping は次のようになります。

Map<Character, Set<Character>> digitMapping = new HashMap<Character, Set<Character>>();

次に、入力から char と String を取得する必要があります。入力行「1 akl」の場合、文字は「1」になり、文字列は「akl」になります。文字から文字列内の文字セットにマッピングしているため、空のセットを作成してマップに入れ、セットに入力する必要があります。次のようなものです(繰り返しますが、これをコンパイルしようとさえしていないので、塩の粒でそれを取ってください):

private void addDigitToMap(char digit, String chars) {
    Set<Character> set = new HashSet<Character>();
    digitMapping.put(set);
    for (char c : chars.toCharArray()) {
        set.add(new Character(c));
    }
 }

したがって、マップには、マップを表すことができる一連の文字を指すエントリが含まれます。

于 2012-09-25T06:27:17.103 に答える