如何从字符串中删除字符?

时间:2011-05-27 13:33:06

标签: java string

public static String removeChar(String s, char c) {
  StringBuffer r = new StringBuffer( s.length() );
  r.setLength( s.length() );
  int current = 0;
  for (int i = 0; i < s.length(); i ++) {
     char cur = s.charAt(i);
     if (cur != c) r.setCharAt( current++, cur );
  }
  return r.toString();
}

我找到了上面的代码here

两个问题:

  1. 为什么我们需要做setLength()?没有它我得到java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:0

  2. 当我使用参数 - “teeter”和“e”运行这个程序时,
  3. 'ttr'和三个垃圾字符即将到来。如何删除缓冲区中未使用的空格?

8 个答案:

答案 0 :(得分:6)

为什么不使用replaceAll? java.lang.String.replaceAll

答案 1 :(得分:2)

我会回答你的问题:

  

1 - 为什么我们需要做setLength()?没有它,我得到   java.lang.StringIndexOutOfBoundsException:   字符串索引超出范围:0

最初你的字符串缓冲区没有字符。您需要调用setLength以使用字符填充空字符串缓冲区。将空字符'\ 0'(或调用它们的垃圾字符)添加到字符串缓冲区中,以使其达到指定的长度。如果不这样做,则会得到StringIndexOutOfBoundsException,因为字符串缓冲区中没有字符。请参阅Javadocs on StringBuffer#setLength

因此,在您的方法结束时,您的字符串缓冲区具有:[t][t][r][\0][\0][\0]

  当我运行这个程序时,

2 - 'ttr'和三个垃圾字符即将到来   参数 - “teeter”和“e”。如何   删除中未使用的空格   缓冲

您可以致电:r.toString().trim()r.substring(0,current)

删除空字符

答案 2 :(得分:1)

看起来你只想使用String.replaceAll(OLD,NEW);

答案 3 :(得分:0)

  

每个字符串缓冲区都有容量。如   只要角色的长度   字符串中包含的序列   缓冲区不超过容量,   没有必要分配新的   内部缓冲区数组。

API - http://download.oracle.com/javase/6/docs/api/java/lang/StringBuffer.html

其次,如果要从开头和结尾删除空格,可以在字符串上调用trim。

但是,其他评论表明你应该使用replace / replaceAll是最相关的。为什么要重写内置方法。

http://download.oracle.com/javase/6/docs/api/java/lang/String.html#replace(char, char)

答案 4 :(得分:0)

有一个更简单的解决方案:

public static String removeChar(String s, char c) {
    return s.replaceAll(Pattern.quote(new StringBuilder().append(c).toString()), "");
}

答案 5 :(得分:0)

忽略您可以使用String.replaceAll()...

的事实

你应该使用append方法:

  public static String removeChar(final String s, final char c) {
    final StringBuffer r = new StringBuffer(s.length());
    for (int i = 0; i < s.length(); i++) {
      final char cur = s.charAt(i);
      if (cur != c) {
        r.append(cur);
      }
    }
    return r.toString();
  }

现在你不会得到StringIndexOutOfBoundsException。

顺便说一句,在单线程环境中,你应该使用StringBuilder。

答案 6 :(得分:0)

您可以使用:

public static String removeChar(String s, char c) {
    StringBuilder r = new StringBuilder();

    for (int i = 0; i < s.length(); i++) {
        char cur = s.charAt(i);
        if (cur != c) {
            r.append(cur);
        }
    }

    return r.toString();
}

答案 7 :(得分:0)

好吧,java.lang.String类中有很多方法。其中之一是replaceAll()方法。

例如,

public class ReplaceAllDemo
{
   public static void main(String[] args)
   {
      String strDemo = "Sam hates java";    
      System.out.println("Before : " + strDemo);
      strDemo = strDemo.replaceAll("hates", "loves");    
      System.out.println("After : " + strDemo);
   }
}

输出

Before : Sam hates java
After : Sam loves java

有关字符串类的更多信息,请参见下面的资源以获取解释和示例,

String replaceAll

String replaceAll example