如何正确使用StringBuffer#insert?

时间:2015-04-19 20:24:39

标签: java for-loop

我尝试使用StringBuffer#insertchar插入一个单词的不同位置,但要么我没有正确使用它,要么我误解了它是什么这个功能实际上是这样吗。

首先,我希望将't'字母添加到"Java"内的不同位置。我已经给出了我尝试使用的代码部分。

例如,第一次运行它应该打印" tJava",然后第二次" Jtava"依此类推,直到它打印完毕后结束#Javat"。但是,我得到的只是:

tJava
ttJava
tttJava
ttttJava

如果我错误地使用它或者有其他方法可以做到这一点,我们将不胜感激。

String addLetter  = "t";
String Word = "Java";

StringBuffer tempWord = new StringBuffer(Word);

for(int i = 0; i<Word.length(); i++) {
    tempWord = tempWord.insert(i, addLetter);
    System.out.println(tempWord);
}

5 个答案:

答案 0 :(得分:2)

当您在insert上致电StringBuffer时,将保留插入的值。例如:

 StringBuffer test = new StringBuffer("test");
 test.insert(1, "t");
 test.insert(3, "t");
 System.out.println(test);

会打印ttetst

因此,如果您真的希望保留更新后的字符串,则不需要重新分配tempWord = tempWord.insert(i, "t");


现在,如果您想在正确的位置显示只添加了1个字符的原始字符串,则必须在每次迭代时将word重新分配给tempWord

String addLetter  = "t";
String Word = "Java";

StringBuffer tempWord = new StringBuffer(Word);

for(int i = 0; i<Word.length(); i++) {
    tempWord = new StringBuffer(Word);
    System.out.println(tempWord.insert(i, addLetter));
}

答案 1 :(得分:1)

StringBufferStringBuilder类是可变的。您使用单个引用并继续在其中插入数据,从而获得此结果。

在循环内移动StringBuffer的声明和初始化。

//removed (commented)
//StringBuffer tempWord = new StringBuffer(Word);
for(int i = 0; i<Word.length(); i++) {
    //using StringBuilder rather than StringBuffer since you don't need synchronization at all
    StringBuilder tempWord = new StringBuilder(Word);
    tempWord = tempWord.insert(i, addLetter);
    System.out.println(tempWord);
}

答案 2 :(得分:1)

让我们看一下迭代:

i goes from 0 to "Java".length() = 4
i = 0 -> insert t in 0 -> Java -> t + Java
i = 1 -> insert t in 1 -> tJava -> t + t + Java
i = 2 -> insert t in 2 -> ttJava -> tt + t + Java
i = 3 -> insert t in 3 -> tttJava -> ttt + t + Java

你想要的是t中的Java插入每次迭代的不同索引,而不是前一次迭代的结果。

因此,您不应该使用上一次迭代的结果,而是重新分配缓冲区:

for(int i = 0 ; i < word.length() ; i++) {
    StringBuilder sb = new StringBuilder(word);
    System.out.println(sb.insert(i, "t"));
}

答案 3 :(得分:0)

如果您坚持使用StringBuffer,则应将其重新分配给每次迭代的原始单词。缓冲区会记住插入。

String addLetter  = "t";
String word = "Java";

for(int i = 0; i<Word.length(); i++) {
    StringBuffer tempWord = new StringBuffer(word);
    tempWord.insert(i, addLetter);
    System.out.println(tempWord);
}

否则请参阅Insert a character in a string at a certain position

答案 4 :(得分:0)

StringBuilder是可变的,并且会在插入调用时自行更新,因此每次循环迭代都会更新实例。要在每次循环迭代时将值插入ORIGINAL字符串,您应该创建一个设置为原始String的新对象

    for(int i = 0; i<Word.length(); i++)
    {   
        StringBuffer tempWord = new StringBuffer(Word);
        System.out.println(tempWord.insert(i, addLetter));
    }