2014-03-13 34 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(); 
} 
相关问题