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

时间:2015-08-17 23:01:06

标签: java boolean

我正在学习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;
}

所有结果都没问题。

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

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

你能否告诉我为什么结果会有所不同?我似乎无法在任何一本书中找到这方面的确切解释。

2 个答案:

答案 0 :(得分:6)

密切关注代码的作用,用英语:

  • 循环遍历字符串的所有字符,从1开始,在结束前一直到1
    • 如果给定位置 i 的角色为*
      • 如果之前的位置和之后的位置相等:
        • 返回false。
  • 返回true。假设其他情况已经耗尽。

你得到完全不同结果的原因是因为你完全翻转了程序的逻辑。这是你的代码,再用英文:

  • 循环遍历字符串的所有字符,从1开始,在结束前一直到1
    • 如果给定位置 i 的角色为*
      • 如果之前的位置和之后的位置不相等:
        • 返回true。
  • 返回false。假设其他情况已经耗尽。

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

答案 1 :(得分:0)

第一种情况有效,因为只有当*前面跟着相同的字符或者string根本不包含*时才返回true。

第二种情况不起作用,因为如果它包含至少一个*,则返回true,并且*的第一个实例前面和后面跟着相同的字符,而不管{{的下一个实例1}}。因此,如果传递一个空字符串,它应返回true,但它返回false,因为它不包含*。如果传递了另一个字符串*,则第二个程序将返回true,因为*xa*a*b的实例遵循约定。第二个程序将立即返回true,在首次出现之后忽略所有*