为什么默认布尔值 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 立即为真,在它首次出现后忽略所有 *
。
我正在学习 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 错误。
- 如果前一个位置和后一个位置的字符相等:
- 如果给定位置 i 的字符是
- Return 是的。假设其他情况已经用尽。
之所以得到完全不同的结果是因为你完全翻转了程序的逻辑。这是您的代码,还是英文版:
- 循环遍历字符串的所有字符,从 1 开始直到结束前的 1
- 如果给定位置 i 的字符是
*
:- 如果前一个位置和后一个位置的字符不相等:
- Return 正确。
- 如果前一个位置和后一个位置的字符不相等:
- 如果给定位置 i 的字符是
- Return 错误。假设其他情况已经用尽。
您还没有将 false
设置为默认 return 选项; 您已经颠倒了整个程序的逻辑。考虑空字符串,这是一个有效的测试用例。你的代码说这是无效的,当字符串中没有星号时(这将是一个奇怪的误报)。
第一种情况有效,因为它 return 只有在 *
前后跟同一个字符或者 string
不包含 [=10] 时才为真=] 完全没有。
第二种情况不起作用,因为它 return 如果它包含至少一个 *
并且 *
的第一个实例前后有相同的字符,则为真不管 *
的下一个实例如何。因此,如果传递了一个空白字符串,它应该 return 为真,但它却 return 为假,因为它不包含 *
。如果传递另一个字符串 *xa*a*b
,第二个程序将 return 为真,因为 *
的实例遵循约定。第二个程序将 return 立即为真,在它首次出现后忽略所有 *
。