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