从String中删除每个字符

时间:2014-05-19 22:54:38

标签: java

我编写了以下程序来删除字符串中的每个字符。

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

请指教。另外,据我所知,我的问题还有其他一百个解决方案。如果您能让我知道我的代码中的错误而不是建议您的解决方案,我将不胜感激;)

3 个答案:

答案 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。