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

这是一个非常奇怪的故障(绝对是可重现的),您可能需要对此提交错误报告。

但是,这是一个临时解决方法;而不是 using .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() 方法也可以。也许尝试使用 List 而不是 StringBuilder,向列表中添加字符并尝试 String.valueOf(s.get(i)); 这应该将字符转换为字符串。我不明白为什么 out 在 Android 中不起作用,但您可能需要稍微修改一下循环。希望有帮助。

于 2013-02-18T02:53:10.290 回答