StringBuilder работает ненормально при использовании его в рекурсии - PullRequest
1 голос
/ 03 апреля 2012

Я не знаю, есть ли в моей реализации ошибки или 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.Я просто создаю копию sb, которая является rep, а затем заменяю содержимое этого недавно созданного StringBuilder.

Ответы [ 2 ]

3 голосов
/ 03 апреля 2012

rep = sb не создает копию sb. Оба эти объекта теперь указывают на один и тот же экземпляр StringBuilder.

2 голосов
/ 03 апреля 2012

Мне кажется, что вы присваиваете ссылку sb на rep, а не создаете копию.

Если вам нужна копия, используйте конструктор StringBuilder, который принимает строку в качестве начального значения:

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

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

...