为什么默认布尔值 return 会影响我的测试结果

Why does the default Boolean return value influence my tests outcome

我正在学习 Java,在完成练习时我偶然发现了 CodingBats sameStarChar 程序中的一个问题。

我知道这是一个简单的练习,但不同结果背后的逻辑真的让我很烦恼。

当我写的时候:

public boolean sameStarChar(String str) {

    for (int i = 1; i < str.length() - 1; i++) {
        if (str.charAt(i) == '*') {
            if (str.charAt(i - 1) != str.charAt(i + 1))
                return false;
        }
    }
    return true;
}

所有结果都OK。

但是当我更改代码并反转 if 块中的条件并将 return false 作为默认 return 值时,代码不再起作用并且一些测试失败:

public boolean sameStarChar(String str) {

    for (int i = 1; i < str.length() - 1; i++) {
        if (str.charAt(i) == '*') {
            if (str.charAt(i - 1) == str.charAt(i + 1))
                return true;
        }
    }
    return false;
}

你能告诉我为什么结果不同吗?我似乎无法在任何书中找到对此的确切解释。

密切注意代码在做什么,英文:

  • 循环遍历字符串的所有字符,从 1 开始直到结束前的 1
    • 如果给定位置 i 的字符是 *:
      • 如果前一个位置和后一个位置的字符相等:
        • Return 错误。
  • Return 是的。假设其他情况已经用尽。

之所以得到完全不同的结果是因为你完全翻转了程序的逻辑。这是您的代码,还是英文版:

  • 循环遍历字符串的所有字符,从 1 开始直到结束前的 1
    • 如果给定位置 i 的字符是 *:
      • 如果前一个位置和后一个位置的字符不相等:
        • Return 正确。
  • Return 错误。假设其他情况已经用尽。

您还没有将 false 设置为默认 return 选项; 您已经颠倒了整个程序的逻辑。考虑空字符串,这是一个有效的测试用例。你的代码说这是无效的,当字符串中没有星号时(这将是一个奇怪的误报)。

第一种情况有效,因为它 return 只有在 * 前后跟同一个字符或者 string 不包含 [=10] 时才为真=] 完全没有。

第二种情况不起作用,因为它 return 如果它包含至少一个 * 并且 * 的第一个实例前后有相同的字符,则为真不管 * 的下一个实例如何。因此,如果传递了一个空白字符串,它应该 return 为真,但它却 return 为假,因为它不包含 *。如果传递另一个字符串 *xa*a*b,第二个程序将 return 为真,因为 * 的实例遵循约定。第二个程序将 return 立即为真,在它首次出现后忽略所有 *