Java 控制流程
Java control flow
我目前正在处理 codingbat 上的 notReplace 问题。我已经确定了错误的代码部分,但不知道为什么。当调用 notReplace("This is right") 时,我得到输出:"Thtest test right"。
为什么下面一段代码运行?
else if (!(Character.isLetter(i-1)) && i+2<len && !(Character.isLetter(i+2))){
newStr += "test";
i++;
}
当 i==2 时,charAt(i-1)=='h' 所以第一个条件已经不满足,因为 h 是一个字母但是 'is' 仍然被替换为 'test'。任何帮助表示赞赏。完整代码如下:
public String notReplace(String str) {
String newStr = "";
String iN = "is not";
int len = str.length();
for (int i=0; i<len; i++){
if (str.substring(i,Math.min(i+2,len)).equals("is")){
if (i==0 && i+2<len && !(Character.isLetter(i+2))){
newStr += iN;
i++;
}
else if (i+2==len && !(Character.isLetter(i-1))){
newStr += iN;
i++;
}
else if (!(Character.isLetter(i-1)) && i+2<len && !(Character.isLetter(i+2))){
newStr += "test";
i++;
}
else newStr += str.charAt(i);
}
else newStr += str.charAt(i);
}
return newStr;
}
Character.isLetter(i - 1)
当 i =2
Character.isLetter(i-1)
--> Character.isLetter(1)
所以它是错误的,因为 1
不是字母。你的第一个条件 !Character.isLetter(i - 1)
是 true.you 错过了 charAt(i-1)
部分
你应该使用
!Character.isLetter(charAt(i-1))
我目前正在处理 codingbat 上的 notReplace 问题。我已经确定了错误的代码部分,但不知道为什么。当调用 notReplace("This is right") 时,我得到输出:"Thtest test right"。 为什么下面一段代码运行?
else if (!(Character.isLetter(i-1)) && i+2<len && !(Character.isLetter(i+2))){
newStr += "test";
i++;
}
当 i==2 时,charAt(i-1)=='h' 所以第一个条件已经不满足,因为 h 是一个字母但是 'is' 仍然被替换为 'test'。任何帮助表示赞赏。完整代码如下:
public String notReplace(String str) {
String newStr = "";
String iN = "is not";
int len = str.length();
for (int i=0; i<len; i++){
if (str.substring(i,Math.min(i+2,len)).equals("is")){
if (i==0 && i+2<len && !(Character.isLetter(i+2))){
newStr += iN;
i++;
}
else if (i+2==len && !(Character.isLetter(i-1))){
newStr += iN;
i++;
}
else if (!(Character.isLetter(i-1)) && i+2<len && !(Character.isLetter(i+2))){
newStr += "test";
i++;
}
else newStr += str.charAt(i);
}
else newStr += str.charAt(i);
}
return newStr;
}
Character.isLetter(i - 1)
当 i =2
Character.isLetter(i-1)
--> Character.isLetter(1)
所以它是错误的,因为 1
不是字母。你的第一个条件 !Character.isLetter(i - 1)
是 true.you 错过了 charAt(i-1)
部分
你应该使用
!Character.isLetter(charAt(i-1))