2014-03-13 37 views
1

我想大寫每個單詞的第一個字母。當我輸入test test test它改變爲Test Test Test,但是如果我在test test test之間使用很多空格,它不會將首字母改爲大寫。我應該如何更改我的代碼才能正常工作?在單詞之間使用大量空格時,第一個字母不會變成大寫字母

public class Solution 
{ 
    public static void main(String[] args) throws IOException 
    { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 


     try{ 
      String test = reader.readLine(); 
      String[] testSplit = test.split(" "); 
      StringBuilder sb = new StringBuilder(); 
      for (int I =0 ; I < testSplit.length ; I ++){ 
       String capitalVer = capitalizeFirstLetter(testSplit[I]); 
       if(I != 0){ 
        sb.append(" "); 
       } 
       sb.append(capitalVer); 
      } 
      System.out.println(sb.toString()); 
     } 
     catch(Exception es) 
     { 

     } 
    } 



    public static String capitalizeFirstLetter(final String string) 
    { 
     if (string == null || string.equals("")) 
      throw new NullPointerException("no string "); 

     return Character.toUpperCase(string.charAt(0)) + string.substring(1); 
    } 
    } 
+0

您的代碼,如圖所示,不會產生你所描述的(不需要)輸出。 –

回答

1

兩件事情。首先,你的意思是分裂的空間:

test.split(" ") 

其次,當你打空字符串,你capitalizeFirstLetter()拋出異常。但是,由於您捕捉並忽略了例外情況,因此您永遠無法看到它。

您有空字符串的原因是您使用單個空格作爲分隔符,因此,例如,分割" "會生成5個空字符串(空格之間)。您可以修改capitalizeFirstLetter()來處理空字符串,也可以分割,例如\s+來摺疊空格 - 但請注意,後者會將輸出中的連續空格摺疊。

添加一個System.out.println(Arrays.toString(testSplit))是一種很好的方法來查看您的數組包含的內容。

這裏的道德是:正確處理異常;不要只是吞下它們而忽視它們。通過捕獲異常並且甚至在發生異常時不打印有關信息,您已經有效地禁用了任何可能允許您追蹤此問題的信息。

順便說一句,NullPointerException不適合那裏的空字符串; IllegalArgumentException可能更具描述性。

+0

對不起,我不明白。 –

+0

@Predict_it你不瞭解什麼部分?你有一個'try ... catch'模塊來捕捉異常。雖然你只是忽略了這個例外。你的代碼拋出異常,但因爲你忽略了它,你永遠不會看到它。這意味着你的代碼試圖告訴你什麼是錯誤的,但是你看不到錯誤,所以你很困惑。 –

+0

java.lang.StringIndexOutOfBoundsException:字符串索引超出範圍:0 –

0

更換

String[] testSplit = test.split(""); 

有:

String[] testSplit = test.split("\\s+"); 

這樣,分裂與空格任意號碼進行。但是,它不會保留每個單詞之間有多少空格。

+0

這將詞語放在一起,但我想保留單詞之間的分隔 –

+0

然後,你可能最好不要使用正則表達式來分割字符串,因爲這不會保留這種信息。把String放進一個StringBuffer可能會更好,然後遍歷它並檢查一個字母是否是第一個字,然後將其大寫。 – AntonH

0

String[] testSplit = test.split("");應該是String[] testSplit = test.split(" ");

,你可能要修剪你的結果,所以capitalizeFirstLetter(testSplit[i].trim());到左側和右側刪除空格。

除非你想保留空格,否則你需要一個不同的方法。

編輯:

如果你想空白留下來,在你capitalizeFirstLetter方法,經過每一個字符,並檢查它是否是一個字母。如果它不是一個字母,則將其附加到輸出字符串(更好的StringBuilder)。如果是一封信,請將其大寫,追加它,追加其餘並返回。

編輯:

你capitalizeFirstLetter看起來是這樣的:

public static String capitalizeFirstLetter (String s) { 
    StringBuilder sb = new StringBuilder(); // use a StringBuilder to construct the output 
    for (int i = 0; i < s.length(); i++) { 
     char c = s.charAt(i); // get current character 
     if (Character.isLetter(c)) { // if character is a letter 
      sb.append(Character.toUpperCase(c)); // capitalize it 
      sb.append(s.substring(i+1)); // append the rest of the string 
      return sb.toString(); // return result 
     } else { 
      sb.append(c); // if character is not a letter, append character 
     } 
    } 
    return sb.toString(); // return result 
} 
+0

是的,我想保留單詞之間的空間。 –

+0

@Predict_it查看更新的答案 – blueygh2

+0

像這樣拆分字符串並不能解決OP描述的無大寫與多空間問題。 –

0

短期和簡單,做整個工作:

public static String capAllFirstLetters (String s) { 
    String capped = ""; 
    char prev = ' '; 
    for (char c : s.toCharArray()) { 
    capped += "" + (Character.isWhitespace(prev) ? Character.toUpperCase(c) : c); 
    prev = c; 
    } 
    return capped; 
} 

或者如果你喜歡的StringBuilder:

public static String capAllFirstLetters (String s) { 
    StringBuilder capped = new StringBuilder(); 
    char prev = ' '; 
    for (char c : s.toCharArray()) { 
    capped.append(Character.isWhitespace(prev) ? Character.toUpperCase(c) : c); 
    prev = c; 
    } 
    return capped.toString(); 
} 
相關問題