我尝试使用StringBuffer#insert
将char
插入一个单词的不同位置,但要么我没有正确使用它,要么我误解了它是什么这个功能实际上是这样吗。
首先,我希望将'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);
}
答案 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)
StringBuffer
和StringBuilder
类是可变的。您使用单个引用并继续在其中插入数据,从而获得此结果。
在循环内移动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);
}
答案 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));
}