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