StringBuilder在Recursion中使用它时工作异常

时间:2012-04-03 19:07:27

标签: java queue stringbuilder

我不知道我的实现是否有错误或StringBuilder出错了。从stackoverflow,我知道Java Strings是不可变的。目前我正在使用StringBuilder以递归方式进行一些字符串处理。为了使递归更清晰易懂,我使用Queue来存储StringBuilder。可以使用String进行相同的处理,但这会增加执行时间,因此我使用的是StringBuilder。输入字符串首先转换为StringBuilder,然后添加到Queue,之后for循环匹配它的字符并用char替换子字符串。结果StringBUilder会添加到Queue。然后从StringBuilder中删除元素(Queue),并以相同的先前方式使用for循环进行处理。重复此过程,直到Queue不为空。以下是我的代码段 -

    Queue<StringBuilder> q = new LinkedList<StringBuilder>();
    StringBuilder sb;
    q.add(new StringBuilder("abcccc"));
    while ((sb = q.poll()) != null) {
        int len = sb.length();

        for (int i = 0; i < len - 1; i++) {
            /*
             * Here i am matching charAt(i) with charAt(i+1) and based on
             * the characters matching decision is done
             */

            StringBuilder rep = new StringBuilder(len - 1);
            rep = sb;
            rep.replace(i, i + 2, replace);//replace is a string which is a character
            q.add(rep);
            }
    }   

这给了我StringIndexOutOfBoundsException。但是我没有改变原始StringBuilder的内容,这是某人。我只是创建sb rep的副本,然后替换新创建的StringBuilder的内容。

2 个答案:

答案 0 :(得分:3)

rep = sb未创建sb的副本。这两个对象现在都指向同一个StringBuilder实例。

答案 1 :(得分:2)

我认为您将sb引用分配给rep,而不是创建副本。

如果需要副本,请使用接受字符串作为初始值的StringBuilder构造函数:

StringBuilder rep = new StringBuilder(sb.toString());

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/StringBuilder.html