Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
递归方法在带有控制台的java中工作,但不适用于android_Java_Android_Methods_Recursion_Static - Fatal编程技术网

递归方法在带有控制台的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我必须尝试一下;如果不亲眼看到,我简直不敢相信@埃里克:很好,深度回答。谢谢