递归方法在带有控制台的java中工作,但不适用于android
我编写了一个递归方法,从字符串中的字符获取所有可能的字符组合。我还有一个方法可以访问它并返回组合列表:递归方法在带有控制台的java中工作,但不适用于android,java,android,methods,recursion,static,Java,Android,Methods,Recursion,Static,我编写了一个递归方法,从字符串中的字符获取所有可能的字符组合。我还有一个方法可以访问它并返回组合列表: public static void uns(String word, StringBuilder s, List combos) { for(char c: word.toCharArray()) { s.append(c); if(word.length() != 1) { uns(remov
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);
}
publicstaticvoiduns(字符串字、字符串生成器、列表组合)
{
for(char c:word.toCharArray())
{
s、 附加(c);
if(word.length()!=1)
{
uns(removeChar(word,c),s,combos);
}
其他的
{
combos.add(s.toString());
}
s、 deleteCharAt(s.toString().length()-1);
}
}
公共静态列表组合(字符串字)
{
列表组合=新的ArrayList();
uns(word、新StringBuilder()、组合);
收益组合;
}
公共静态字符串removeChar(字符串s,字符c)
{
int index=s.indexOf(c);
返回s.substring(0,索引)+s.substring(索引+1);
}
在Java中测试时,它运行时没有任何缺陷。出于某种原因,当我在Android中使用它时,列表中填充了正确数量的元素,但每个元素都是相同的。例如,对于单词“here”,它返回一个充满“eerh”的列表。这是一个非常奇怪的小故障(绝对可以重现),您可能需要就此提交一份错误报告 然而,这里有一个临时的解决办法;而不是使用
.toString()
,它似乎以某种方式重用引用(即使我使用它.substring(0)
),因此所有引用都会得到更新;如果您在每次迭代后打印出列表,您就会明白我的意思
这是我的老套/低效的解决方案。更改:
combos.add(s.toString());
。。。致:
combos.add(s + "");
这将有效地将字符串正确克隆到数组中,以便它们不会被操纵:
02-17 19:33:48.605:I/System.out(6502):[组合]:[这里,嘿嘿,嘿嘿,嘿嘿,嘿嘿,嘿嘿,嘿嘿,嘿嘿,嘿嘿,嘿嘿,嘿嘿,嘿嘿,嘿嘿,嘿嘿,嘿嘿,嘿嘿,嘿嘿,嘿嘿,嘿嘿]
我不是肯定的,但我认为string类中的valueOf()方法也会起作用。可能尝试使用列表而不是StringBuilder,向列表中添加字符,然后尝试String.valueOf(s.get(i));这将把字符转换成字符串。我不明白为什么out在Android中不起作用,但您可能需要稍微修改一下循环。希望能有所帮助。removeChar()的定义是什么?@Eric抱歉,重新编辑。不,与
.valueOf()的问题相同。
。我认为String.valueOf(StringBuilder)
只返回StringBuilder.toString()
,这与OP的代码相同。@A--C我必须尝试一下;如果不亲眼看到,我简直不敢相信@埃里克:很好,深度回答。谢谢