StringBuilder работает ненормально при использовании его в рекурсии

Я не знаю, есть ли в моей реализации ошибки или StringBuilder идет не так Из стека overoverflow я узнал, что 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 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам