我最近遇到了一个解决方案,可以编写一个程序,将字符串中的每个单词都大写,我真的很努力地试图理解它,但我无法克服一个障碍。
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)
语句来做这件事,但我看不出有任何理由这样做,因为它从来没有指定它正在寻找空格。任何指向正确方向的指示都将不胜感激
编辑:谢谢大家的回答,我想我现在终于明白了!
2条答案
按热度按时间dy2hfwbg1#
看看循环中的代码,稍微精简一下:
代码不关心变量或方法的调用:它检查字符是否满足某个条件(
Character.isLetter
),然后记录该字符是否符合该条件(在foundSpace
中)。这意味着
foundSpace
包含上一个字符是否符合该标准,并允许您根据前一个字符的内容决定对当前字符执行某些操作:在您的示例中,如果前一个字符*不符合标准,则该字符应为大写。foundSpace
最初设置为true
,这意味着循环将以字母开头的字符串视为前面有空格,因此将大写。实际上,所使用的标准和变量名称之间只是不匹配:
Character.isWhitespace
作为判断标准,并保留标志名称为foundSpace
;Character.isLetter
作为您的标准,并将标志命名为foundLetter
(并颠倒其含义,因此检查if (!foundLetter)
等,因为它更容易处理“积极”检查(if (foundLetter)
)而不是“消极”检查(if (!foundLetter)
))。7lrncoxx2#
仅当满足以下条件时,FoundSpace才设置为FALSE:
都被触发了。
如果条件没有被触发,也就是如果字符不是字母,则finSpace将设置为True。
这意味着任何不是字母的内容都会将finSpace设置为True。正如Silvio指出的,这包括其他非空格字符,如1、$和“。
与其检查字符是否是字母,不如检查charArray[i]是否等于空格。
如下所示:
有关Character类的更多信息可以在下面找到:https://www.geeksforgeeks.org/character-equals-method-in-java-with-examples/
您所展示的代码可能会产生一些不受欢迎的副作用--特别是如果稍后依赖了finSpace--因为它可能会让您认为单词中存在空格,而不是空格,而是一个字符,而不是“$”这样的字母。
在整个程序的上下文中,这看起来如下所示:
对代码进行了一些编辑,以修复编译错误,这要归功于您的建议注解中的那些编辑。