Java 第一个字母不';在单词之间使用大量空格时,不要改为大写

Java 第一个字母不';在单词之间使用大量空格时,不要改为大写,java,Java,我想把每个单词的第一个字母大写。当我输入test-test时,它会变为test-test,但如果我在test-test之间使用大量空格,它不会将首字母改为大写。我应该如何更改代码才能正常工作 public class Solution { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputSt

我想把每个单词的第一个字母大写。当我输入
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);
    }
    }
公共类解决方案
{
公共静态void main(字符串[]args)引发IOException
{
BufferedReader reader=新的BufferedReader(新的InputStreamReader(System.in));
试一试{
字符串测试=reader.readLine();
字符串[]testSplit=test.split(“”);
StringBuilder sb=新的StringBuilder();
for(int I=0;I
更换

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


通过这种方式,可以使用任意数量的空格进行拆分。但是,它不会保留每个单词之间的空格数量。

String[]testSplit=test.split(“”)应该是
String[]testSplit=test.split(“”)

并且您可能需要修剪结果,因此
capitalizeFirstLetter(testSplit[i].trim())
删除左侧和右侧的空白

除非您希望保留空白,否则您将需要一种不同的方法

编辑:

如果希望保留空白,请在
capitalizeFirstLetter
方法中,检查每个字符是否为字母。如果不是字母,则将其附加到输出字符串(更好的StringBuilder)。如果它是一个字母,大写,加上它,再加上其余的,然后返回

编辑:

您的第一封信可能如下所示:

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
}
公共静态字符串大写第一个字母(字符串s){
StringBuilder sb=new StringBuilder();//使用StringBuilder构造输出
对于(int i=0;i
两件事。首先,您的意思是在空格上拆分:

test.split( " " )
其次,当您点击空字符串时,
capitalizeFirstLetter()
会引发异常。但是,由于您正在捕获并忽略异常,因此您永远看不到它

使用空字符串的原因是使用单个空格作为分隔符,例如,拆分
“”
,将导致5个空字符串(在空格之间)。您可以修改
capitalizeFirstLetter()
来处理空字符串,也可以拆分,比如说,
\s+
来折叠空格——但是请注意,后者将折叠输出中的连续空格

添加
System.out.println(Arrays.toString(testSplit))
是准确查看数组包含内容的好方法

这里的寓意是:正确处理异常;不要只是吞下它们并忽略它们。通过捕获异常,甚至在异常发生时不打印有关它们的信息,可以有效地禁用任何可能让您跟踪此问题的信息


顺便说一句,
NullPointerException
实际上并不适用于空字符串;
IllegalArgumentException
可能更具描述性。

简短而简单,完成整个工作:

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

这会将单词放在一起,但我希望保持单词之间的分隔。因此,最好不要使用正则表达式分隔字符串,因为这样不会保留此类信息。最好将
字符串
放入
字符串缓冲区
,循环检查它并检查字母是否是单词的第一个字母,然后将其大写。像这样拆分字符串并不能解决多个空格不大写的问题。@Predict\u看看编辑过的答案,我已将代码包含在我之前描述的内容中,以防您不清楚您的代码(如图所示)不会产生您描述的(不希望的)输出。对不起,我不明白。@Predict\u您不明白哪部分?您有一个
try…catch
块来捕获异常。不过,您可以忽略例外情况。您的代码正在抛出一个异常,但因为您忽略了它,所以您永远看不到它。这意味着您的代码试图告诉您出了什么问题,但您看不到错误,因此您感到困惑。java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:0@Predict_it此问题的答案详细描述了您的问题,并提供了解决问题所需的所有信息。除了为你工作之外,我能提供的东西不多了,我不会这么做的。
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();
}