我最近遇到了这个解决方案,用来编写一个将字符串中的每个单词大写的程序,我真的很难理解它,但我无法跨越一个障碍。
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);
}
感谢您在评论中提出的建议,对代码进行了一些编辑以修复编译错误。