2014-11-15 120 views
0

我有一個由用戶輸入的字符串。 我試圖用空格替換所有非大寫字母(即數字或符號),而不使用諸如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 

我不斷收到錯誤的字符串索引超出範圍。我相信它與:

ch = emptyString.charAt(0); 

因爲emptyString沒有任何字符。但即使我把一個任意常量放進去,它也不會用這個任意常量替換非字母。

回答

3

這不是你如何替換Java字符串中的字符。在Java中,字符串是不可變的,所以你不能設置任何給定的索引。另外,charAt()方法不會對所調用的字符串做任何事情 - 它所做的只是在該位置返回char。最後,您可能不應該使用void - 返回String,並在方法末尾替換字符,然後使用返回值。你可以通過你的初始迭代string做到這一點,建立一個新的string,使用Character類的靜態isUpperCase方法:

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是非常低效的。

+0

isnt isUpperCase是字符類的一種方法嗎?即Character.isUpperCase(char) –

+0

@MauricioTrajano哦,你是對的 - 現在編輯。 – furkle

+0

@MauricioTrajano,我只是猜錯。 :) – bumbumpaw

0

您必須記住,Java中的參數是作爲值傳遞的,而不是作爲引用傳遞的,在這種情況下,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(); 
} 
+0

謝謝,但不幸的是我不能使用String Builders。 – hello