2013-02-18 56 views
9

我写了一个递归方法,它可以从字符串中的字符中获取所有可能的字符组合。我也有一个方法来访问它,并返回一个组合列表:递归方法在java中通过控制台工作,但不适用于android

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”的列表。

+0

'removeChar()'的定义是什么? – Eric 2013-02-18 02:16:40

+0

@Eric对不起,编辑回。 – Wilson 2013-02-18 02:18:29

回答

9

这是一个非常奇怪的故障(绝对可重复),你可能想要提交一个关于这个错误报告。

但是,这里是临时解决方法;而不是使用.toString(),它似乎以某种方式重用了参考(即使我使用.substring(0)),所以它们都得到更新;如果你在每次迭代后打印出列表,你会明白我的意思。

这是我的hacky /效率低下的解决方案。变化:

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]

+0

+1为自己尝试*和*提出一个解决方案! – 2013-02-18 02:55:01

+1

@ A - C我必须尝试;我无法亲眼看到它,我无法相信它。 :) – Eric 2013-02-18 02:57:19

+0

@Eric伟大的,深入的答案。谢谢。 – Wilson 2013-02-18 20:06:22

0

我不积极,但我认为从字符串分类的valueOf()方法s也会起作用。也许尝试使用List而不是StringBuilder,将字符添加到列表并尝试String.valueOf(s.get(i));并且应该将字符转换为字符串。我不明白为什么在Android中不起作用,但您可能需要修改一下您的循环。希望有所帮助。

+0

不是,与'.valueOf()'相同的小故障。我认为'String.valueOf(StringBuilder)'刚刚返回'StringBuilder.toString()',这与OP的代码相同。 – Eric 2013-02-18 02:54:20

相关问题