2015-08-16 3 views
0

В Java я могу перебирать содержимое StringBuilder и удалять/вставлять/заменять символы так, чтобы цикл оставался постоянным? Если это так, наилучшей практикой, я должен использовать for-loop, iterator или традиционный цикл от нуля до длины() - 1? НАПРИМЕР,изменить stringbuilder во время итерации на нем

StringBuilder b=new StringBuilder("12345"); 
for (int i=0; i< b.length(); i++) //traditional loop, iterator(which?),other? 
    char c= b.chartAt(i); 
    if(c == '1') b.deleteCharAt(i); // reduce the size,what is i pointing to now? 
    if(c=='2') b.insert(i,"two"); //increase the size 

}

Edit: у меня есть большая строка, и мне нужно сделать изменения на нем, и я «не хочу производить копирует каждый раз. StringBuilder - это изменяемая строка, как я могу ее правильно использовать для внесения изменений в место? Я знаю, что я могу использовать replace/replaceall в самой строке, но здесь дело не в этом.

+2

Если вы хотите удалить что-либо, то лучше итерации от конца до начала строки. – STaefi

+0

Почему у вас есть 'b.insert (2," two ")'? это должно быть 'i' или' 2'? – Karthik

+0

спасибо, исправлено! это я, конечно! – legrass

ответ

0

Если вы хотите перебирать более StringBuilder, то вы, вероятно, делаете что-то неправильно, потому что оно просто предназначено для разных целей (например, динамически строит здания, как вы заметили от его имени). Если вы хотите получить новую последовательность символов, изменив некоторые из них, используйте String, если у вас нет определенных требований.

+0

Дело в том, что у меня большая строка, и я знаю, что мне нужно сделать много изменений. Я не хочу создавать копии все время, но используя StringBuilder в качестве изменяемой строки, что и этот класс. – legrass

+0

Если вам нужна изменчивость, почему бы вам не использовать StringBuffer? Почему использование StringBuilder необходимо? Я имею в виду, что это может запутать других разработчиков ... –

+0

извините, я этого не понимаю. StringBuffer и StringBuilder по сути то же самое, просто заботятся о потокобезопасности, насколько я знаю. – legrass

0

Вы можете это сделать, но вы должны соответственно изменить значение i.

StringBuilder b=new StringBuilder("12345"); 
for (int i=0; i< b.length(); i++) { 
     char c= b.chartAt(i); 
     if(c == '1'){ 
      b.deleteCharAt(i); 
      i--; // because you don't want to miss out the next char after deleting the present char 
     } 
     else if(c=='2'){ 
      b.insert(i,"two"); // I am not sure you want 2 or i 
      i=i+2; // change this accordingly. 
      } 
} 
1

Думаю, вы можете это сделать. Я согласен с STaefi, вы должны повторить его с конца до начала:

StringBuilder b=new StringBuilder("12345"); 
     for (int i = b.length() - 1; i >=0 ; i--){ //traditional loop, iterator(which?),other? 
      char c = b.charAt(i); 
      if(c == '1') b.deleteCharAt(i); // reduce the size,what is i pointing to now? 
      if(c=='2') b.insert(2,"two"); //increase the size 
     } 
Смежные вопросы