替换字符

时间:2014-11-15 00:57:14

标签: java loops char

我有一个用户输入的字符串。  我试图用空格替换所有非大写字母(即数字或符号),而不使用replace()Stringbuildersarrays等方法。

这是我到目前为止所做的:

public static void formatPlaintext(String sentence){

  String sentenceUpper = sentence.toUpperCase();
  System.out.println(sentenceUpper);

  String emptyString = " ";
  for(int i = 0; i< sentenceUpper.length() ; i++){
      char ch = sentenceUpper.charAt(i);
      if(ch < 'A' || ch > 'Z'){
        ch = emptyString.charAt(0);
      }

    }

}//end of formatPlaintext 

我不断收到String索引超出范围的错误。我相信它与:

有关
ch = emptyString.charAt(0); 

因为emptyString没有任何字符。但即使我把一个任意常数放入其中,它也不会用这个任意常数替换非字母。

2 个答案:

答案 0 :(得分:3)

这不是如何替换Java字符串中的字符。在Java中,字符串是不可变的,因此您无法设置任何给定的索引。此外,charAt()方法不会也无法对您调用它的字符串执行任何操作 - 只需返回该位置的char即可。最后,您可能不应该使用void - 返回在方法结尾处替换了字符的String,然后使用返回值。您可以使用string类的静态string方法迭代初始isUpperCase并构建新的Character来完成此操作:

public static String formatPlainText(String sentence) 
{
    String replacedSentence = "";

    for(int i = 0; i< sentence.length() ; i++){
        char ch = sentence.charAt(i);

        if (Character.isUpperCase(ch)) {
            replacedSentence += ch;
        }
        else {
            replacedSentence += " ";
        }
    }   

    return replacedSentence;
}

如果您经常使用此功能,或者特别长Strings,您应该绝对使用StringBuilder - 逐个字符地连接String是非常低效的。

答案 1 :(得分:0)

你必须记住Java中的参数是作为值而不是作为引用传递的,在这种情况下,String是一个不可变对象,即当你进行连接或替换你时,不能更改String。有效地创建一个新的String。

我建议稍微修改一下代码以返回构建的新String。

public static String formatPlaintext(String sentence){

  String sentenceUpper = sentence.toUpperCase();
  System.out.println(sentenceUpper);

  StringBuilder builder = new StringBuilder;
  for(int i = 0; i< sentenceUpper.length() ; i++){
      char ch = sentenceUpper.charAt(i);
      if(ch < 'A' || ch > 'Z'){

       builder.append(' ');

      } else {
         builder.append(ch);  
      }
  }
  return builder.toString();
}