9

文字列内の文字から可能なすべての文字の組み合わせを取得する再帰的なメソッドを作成しました。それにアクセスしてコンボのリストを返すメソッドもあります。

public static void uns(String word, StringBuilder s, List combos)
{
    for(char c: word.toCharArray())
    {
        s.append(c);
        if(word.length() != 1) 
            {
            uns(removeChar(word, c),s,combos);
            }
        else
        {
            combos.add(s.toString());
        }
        s.deleteCharAt(s.toString().length()-1);
    }

}

public static List getCombinations(String word)
{
    List<String> combinations = new ArrayList<String>();
    uns(word,new StringBuilder(),combinations);
    return combinations;
}

public static String removeChar(String s, char c)
{
    int index = s.indexOf(c);
    return s.substring(0,index)+s.substring(index+1);
}

Java でテストしたところ、問題なく動作しました。何らかの理由で、Android で使用すると、リストには正しい数の要素が入力されますが、すべての要素は同じです。たとえば、「here」という単語の場合、「eerh」で満たされたリストが返されます。

4

2 に答える 2

9

これは非常に奇妙なグリッチ(間違いなく再現可能)であり、これに関するバグレポートを提出することをお勧めします。

ただし、これは一時的な回避策です。を使用する代わりに、.toString()(私がそれを使用したとしても)何らかの形で参照を再利用している.substring(0)ように見えるので、それらはすべて更新されます。各反復の後にリストを印刷すると、私が何を意味するかがわかります。

これが私のハッキー/非効率的な解決策です。変化する:

combos.add(s.toString());

... に:

combos.add(s + "");

これにより、文字列が配列に適切に複製されるため、操作されません。

02-17 19:33:48.605: I/System.out(6502): [Combos]: [here, heer, hree, hree, here, heer, ehre, eher, erhe, ereh, eehr, eerh, rhee, rhee, rehe, reeh, rehe, reeh, ehre, eher, erhe, ereh, eehr, eerh]

于 2013-02-18T02:34:59.040 に答える
0

私は肯定的ではありませんが、文字列クラスの valueOf() メソッドも機能すると思います。StringBuilder の代わりに List を使用してみてください。リストに文字を追加して、String.valueOf(s.get(i)); を試してください。文字を文字列に変換する必要があります。Android で out が機能しない理由はわかりませんが、ループを少し変更する必要があるかもしれません。それが役立つことを願っています。

于 2013-02-18T02:53:10.290 に答える