我编写了以下程序来删除字符串中的每个字符。
public static String removeMultipleCharsFromStr(String str,char temp) {
StringBuffer sb = new StringBuffer();
for(int i=0;i<str.length();i++) {
sb.append(str.charAt(i));
}
for(int i=0;i<sb.length();i++) {
if(Character.toLowerCase(sb.charAt(i)) == Character.toLowerCase(temp)) {
sb.deleteCharAt(i);
}
}
System.out.println("Final string: " +sb.toString());
return sb.toString();
}
当我调用该方法时,它不会删除每次出现的字符。有人可以告诉我,我在这里犯了什么错误吗?
public class RemoveChar {
public static void main(String[] args) {
removeMultipleCharsFromStr("SSSSSaerty", 'S');
}
输出 - Final string: SSaerty
请指教。另外,据我所知,我的问题还有其他一百个解决方案。如果您能让我知道我的代码中的错误而不是建议您的解决方案,我将不胜感激;)
答案 0 :(得分:3)
不确定其他答案发生了什么,但让我们看看你的算法会发生什么。
当所有内容都放在StringBuffer
中时,它看起来像这样:
i
Index: 0 1 2 3 4 5 6 7 8 9
Value: S S S S S a e r t y
在第一次迭代中(在最后一个循环中),您正在查看索引0(i
为0)。索引0处的char是 S ,因此您将其删除。现在你的缓冲区看起来像这样:
i
Index: 0 1 2 3 4 5 6 7 8
Value: S S S S a e r t y
第一个 S 已消失,但所有其他字符向左移动了1个位置,而不是将索引0留空。在下一次迭代中,i
为1.这意味着您从不查看索引0处的新值。
当你从1到2和2到3时会发生同样的事情。最后,这意味着你跳过了2个 S 值。如果增加连续 S 值的数量,您将在输出中看到更多这些值。
i
Index: 0 1 2 3 4 5 6 7
Value: S S S a e r t y
i
Index: 0 1 2 3 4 5 6
Value: S S a e r t y <-- See?
如果您能告诉我代码中的错误而不是建议您的解决方案,我会感激不尽;)
足够公平。祝它好运。 :)
答案 1 :(得分:0)
在您删除字符时,for循环会前进。因此,另一个角色将位于您刚刚通过的指数位置。修复将是:
public static String removeMultipleCharsFromStr(String str,char temp) {
StringBuffer sb = new StringBuffer();
for(int i=0;i<str.length();i++) {
sb.append(str.charAt(i));
}
for(int i=0;i<sb.length();i++) {
if(Character.toLowerCase(sb.charAt(i)) == Character.toLowerCase(temp)) {
sb.deleteCharAt(i);
i--;
}
}
System.out.println("Final string: " +sb.toString());
return sb.toString();
}
虽然您可能会考虑使用评论中建议的标准替换方法:
str.replaceAll(String.valueOf(temp),"")
答案 2 :(得分:0)
只需在i--;
之后添加sb.deleteCharAt(i);
即可。这样,你就可以继续上下车了。否则,您跳过下一个字符,因为StringBuffer
的大小减少了1。