将字符串中的每个单词大写,此代码如何检查前面的空格

mnowg1ta  于 2022-10-01  发布在  Java
关注(0)|答案(2)|浏览(129)

我最近遇到了一个解决方案,可以编写一个程序,将字符串中的每个单词都大写,我真的很努力地试图理解它,但我无法克服一个障碍。

public class test {
    public static void main(String[] args) {

        // create a string
        String message = "everyone loves java";

        // stores each characters to a char array
        char[] charArray = message.toCharArray();
        boolean foundSpace = true;

        for(int i = 0; i < charArray.length; i++) {

            // if the array element is a letter
            if(Character.isLetter(charArray[i])) {

                // check space is present before the letter
                if(foundSpace) {

                    // change the letter into uppercase
                    charArray[i] = Character.toUpperCase(charArray[i]);
                    foundSpace = false;
                }
            }

            else {
                // if the new character is not character
                foundSpace = true;
            }
        }

        // convert the char array to the string
        message = String.valueOf(charArray);
        System.out.println("Message: " + message);
    }

我理解这段代码中的所有内容,除了它如何检查前一个字符是否是空格。评论说它用if(foundSpace)语句来做这件事,但我看不出有任何理由这样做,因为它从来没有指定它正在寻找空格。任何指向正确方向的指示都将不胜感激

编辑:谢谢大家的回答,我想我现在终于明白了!

dy2hfwbg

dy2hfwbg1#

看看循环中的代码,稍微精简一下:

for(int i = 0; i < charArray.length; i++) {
  if(Character.isLetter(charArray[i])) {
    // check space is present before the letter
    if(foundSpace) {
      // Some code.
      foundSpace = false;
    }

    // Here, foundSpace is false.

  } else {
    foundSpace = true;
  }
}

代码不关心变量或方法的调用:它检查字符是否满足某个条件(Character.isLetter),然后记录该字符是否符合该条件(在foundSpace中)。

这意味着foundSpace包含上一个字符是否符合该标准,并允许您根据前一个字符的内容决定对当前字符执行某些操作:在您的示例中,如果前一个字符*不符合标准,则该字符应为大写。

foundSpace最初设置为true,这意味着循环将以字母开头的字符串视为前面有空格,因此将大写。

实际上,所使用的标准和变量名称之间只是不匹配:

  • 如果判断标准为是否为空格,则使用Character.isWhitespace作为判断标准,并保留标志名称为foundSpace
  • 如果标准确实是“这是一个字母”,请使用Character.isLetter作为您的标准,并将标志命名为foundLetter(并颠倒其含义,因此检查if (!foundLetter)等,因为它更容易处理“积极”检查(if (foundLetter))而不是“消极”检查(if (!foundLetter)))。
7lrncoxx

7lrncoxx2#

仅当满足以下条件时,FoundSpace才设置为FALSE:

(Character.isLetter(charArray[i]))

都被触发了。

如果条件没有被触发,也就是如果字符不是字母,则finSpace将设置为True。

这意味着任何不是字母的内容都会将finSpace设置为True。正如Silvio指出的,这包括其他非空格字符,如1、$和“。

与其检查字符是否是字母,不如检查charArray[i]是否等于空格。

如下所示:

boolean foundSpace = Character.isWhitespace(charArray[i])

有关Character类的更多信息可以在下面找到:https://www.geeksforgeeks.org/character-equals-method-in-java-with-examples/

您所展示的代码可能会产生一些不受欢迎的副作用--特别是如果稍后依赖了finSpace--因为它可能会让您认为单词中存在空格,而不是空格,而是一个字符,而不是“$”这样的字母。

在整个程序的上下文中,这看起来如下所示:

public class test {
public static void main(String[] args) {

    // create a string
    String message = "everyone loves java";

    // stores each characters to a char array
    char[] charArray = message.toCharArray();
    boolean foundSpace = true;

    for(int i = 0; i < charArray.length; i++) {
        if(Character.isWhitespace(charArray[i])){
            foundSpace = true;
        }
        else{
            foundSpace = false;
        }
        // if the array element is a letter
        if(Character.isLetter(charArray[i])) {
            // check space is present before the letter
            if(foundSpace) {

                // change the letter into uppercase
                charArray[i] = Character.toUpperCase(charArray[i]);
            }
        }
        else {
            // if the new character is not character
            // delete this condition if you don't plan to use it
        }
    }

    // convert the char array to the string
    message = String.valueOf(charArray);
    System.out.println("Message: " + message);
}

对代码进行了一些编辑,以修复编译错误,这要归功于您的建议注解中的那些编辑。

相关问题