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



我最近遇到了这个解决方案,用来编写一个将字符串中的每个单词大写的程序,我真的很难理解它,但我无法跨越一个障碍。

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)语句来实现这一点,但我看不出有任何理由这样做,因为它从未指定它正在寻找空间。任何指向正确方向的指针都将受到赞赏

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

看看循环中的代码,去掉一点:

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

foundSpace仅在条件为时设置为false

(Character.isLetter(charArray[i]))

被触发。

如果未触发该条件,也就是说,如果字符不是字母,则foundSpace将设置为True。

这意味着任何不是字母的东西都会将foundSpace设置为true。正如Silvio所指出的,这包括其他非空格字符,如1、$和"。

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

像这样:

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

有关Character类的更多信息,请参阅以下内容:https://www.geeksforgeeks.org/character-equals-method-in-java-with-examples/

你展示的代码可能会有一些不可取的副作用,尤其是如果foundSpace后来被依赖的话,因为它可能会让你相信一个单词中存在一个空格,当它根本不是空格,而是一个不像"这样的字母的字符时$&";。

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

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

感谢您在评论中提出的建议,对代码进行了一些编辑以修复编译错误。

最新更新