2

私は現在、アナグラムソルバーに取り組んでいます。比較する前に、ユーザー入力と辞書リストの両方の文字をアルファベット順に並べ替えるという 1 つの推奨事項が記載された、非常に優れた投稿を見ました。面白そうだったので挑戦してみます。以前は順列を使用していましたが、複数の単語のアナグラムを解決するために最終的に (そして効率的に) 使用できるものが必要です。

ユーザー入力と辞書の両方を char 配列に入れ、アルファベット順に並べ替えることができます。次に、それぞれを比較して、何かがアナグラムかどうかを判断できるようにする必要があります。アルファベット順のユーザー入力を取得し、アルファベット順の辞書に含まれているかどうかを判断することを考えました。以下にコードを掲載しました。ご想像のとおり、私はこのプロセスのロジックについて少し混乱しています。誰かが私がロジックを少し整理するのを手伝ってくれるかどうか疑問に思っていました. 助けてくれてありがとう。

public class AnagramSolver1 {

    public static void main(String[] args) throws IOException {

        List<String> dictionary = new ArrayList<String>();
        List<String> inputList = new ArrayList<String>();
        BufferedReader in = new BufferedReader(new FileReader("src/dictionary.txt"));
        String line = null;
        Scanner scan = new Scanner(System.in);

        while (null!=(line=in.readLine())){
            dictionary.add(line);
        }
        in.close();

        char[] sortDictionary;
        char[] inputSort;

        System.out.println("Enter Word: ");

        String input = scan.next();
        inputList.add(input);

        //Getting a little confused here. I thought about sorting my input
        //then iterating through my dictionary (while sorting it too) and comparing
        //thus far it produces nothing
        for(int i = 0; i < inputList.size(); i++){          
            inputSort = inputList.get(i).toCharArray();
            Arrays.sort(inputSort);

            for (int j = 0; j < dictionary.size(); j++) {

                sortDictionary = dictionary.get(i).toCharArray(); 
                Arrays.sort(sortDictionary);

                if(inputSort.equals(sortDictionary)){
                    System.out.println("Anagram" +dictionary.get(i));
                } //end if

            }//end for

        }//end for

     }//end main
}
4

2 に答える 2

2

Map<String, Set<String>>ソートされた文字列を、そのアナグラムである一連の文字列にマップする を維持してみませんか。辞書から単語を読み取るときに、このマップを更新できます。たとえば、単語を読んだ場合dog、エントリをマップに追加します(単語の並べ替えられた文字で構成さ"dgo" => {"dog"}れることに注意してください)。次に、単語を読んだ場合、その文字を並べ替えて同じものを取得し、その結果、前のエントリを に修正します。もちろん、辞書内のすべての単語に対してこれを繰り返します。dgodoggoddgo"dgo" => {"dog", "god"}

これにより、すばやく簡単にクエリを実行できるようになります。単語のアナグラムを見つけたい場合は、dogを使用しますmap.get(sortChars("dog"))

別の注意として、他の回答が言及したこと、つまりコードをモジュール化することが重要であることを繰り返します。すべてを 1 か所にまとめるのではなく、論理的に関連する関数/タスクを独自のメソッドに配置する必要があります。これは、読みやすさと、あなた/他の人が将来あなたのコードを維持する能力に役立ちます.

于 2013-06-13T20:01:31.713 に答える