繁体   English   中英

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

[英]How do I remove a character from a 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();
}

我在这里找到了上面的代码。

两个问题:

  1. 为什么我们需要做 setLength()? 没有它我得到 java.lang.StringIndexOutOfBoundsException: String index out of range: 0

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

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

我会回答你的问题:

1 - 为什么我们需要做 setLength()? 没有它我得到 java.lang.StringIndexOutOfBoundsException: String index out of range: 0

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

所以在你的方法结束时,你的字符串缓冲区有: [t][t][r][\0][\0][\0]

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

您可以通过调用删除 null 字符: r.toString().trim()r.substring(0,current)

似乎您只想使用 String.replaceAll(OLD, NEW);

嗯, java.lang.String class中有很多方法。 其中之一是 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);
   }
}

Output

Before : Sam hates java
After : Sam loves java

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

字符串替换全部

字符串替换所有示例

每个字符串缓冲区都有一个容量。 只要字符串缓冲区包含的字符序列的长度不超过容量,就不需要分配新的内部缓冲区数组。

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

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

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

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

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

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

忽略您可以使用 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。

您可以使用:

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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM