-4

私はJavaプログラムを持っています

  • テキストファイルを読み取り、
  • すべての言葉をArrayList
  • すべての単語を ,ArrayList句読点を削除して小文字にします

あと2点作りたいと思っています。

  • String ArrayList の文字列のすべてのアナグラムを作成する関数。
  • 各アナグラムと元の文字列を ArrayList の各 ArrayList に格納する ArrayList の ArrayList。

したがって、あるArrayListから新しいArrayListに挿入する文字列を取得し、すべてのアナグラムを作成してArrayListに配置し、そのArrayListを古いArrayListを読み取っているArrayListに配置する関数を開発したいと考えています。

次のようになります。

List<String> arLists = new ArrayList<String>(); //makes new array list
    for(String arList : words) //takes values from old array list
        ArrayList<String> anaLists = new ArrayList<String>(); //makes a new array list
        arLists.add(anag(anaLists,arList,"")); //uses a function that makes an 

このような関数を作りたいのですが、ここで作ったものは... うまくいきません。

public void anag(ArrayList<String> anaLists, String s1, String s2){
    if(s1.length() == 0){
        return anaLists;
    }
    for(int i = 0 ; i < s1.length() ; i++){ //only runs for string length
        String anaList = anag(s1.substring(0, i) + s1.substring(i+1, s1.length()), s1.charAt(i) + s2);
        anaLists.add(anaList);
        }
    }

これに関するいくつかのガイダンスは素晴らしいでしょう。

4

2 に答える 2

0

文字列からすべてのアナグラムを作成するには、次の手順に従います。

手順1:文字列を使用replaceして空白を削除し、句読点と大文字と小文字がすべて削除されていることを確認します。

ステップ2:この関数f(string s, string anagram, ArrayList<String> array)を記述し、次のように呼び出しますs = yourstring, anagram = "", array = new ArrayList<String>()

If s is empty, add anagram to array and return
For each letter l in s:
    newanagram = anagram + l
    news = s with l taken out of it (e.g. make a substring of everything before l in s and everything after l in s, and concatenate them together)
    call f(news, anagram, array)

これにより、再帰的な自己呼び出しの「ツリー」が探索され、「ツリー」の「リーフ」ごとに、すべての文字の可能な順列が配列に追加されます。終了すると、n * n-1 * n-2 * n-3 ...別名n階乗エントリが配列に含まれます。これにより、正しい方向に進んでいることがわかります:)

また、配列リスト内のすべての文字列のアナグラムが必要な場合は、forループで呼び出すだけです。

于 2013-03-13T04:45:15.727 に答える