Java中判断无下划线短语是否为isogram的代码异常排查请求
Isogram判断代码的测试失败原因分析
有一段用于判断字符串是否为**Isogram(等值图,即字符串中每个字母仅出现一次,连字符、空格等非字母字符不参与重复判定)**的Java代码,它通过了大部分测试用例,但在以下测试中失败了,我们来分析具体原因。
问题代码
class IsogramChecker { boolean isIsogram(String phrase) { if (phrase == null) return false; phrase = phrase.toLowerCase(); char phraseArray [] = phrase.toCharArray(); for (char ch:phraseArray) if (ch == '-') return true; else if (ch == ' ') return true; else if (ch == '_' & ch == ' ' || ch == '-') return true; else if (phrase.indexOf(ch) != phrase.lastIndexOf(ch)) return false; return true; // return phrase.length() == phrase.toLowerCase().chars().distinct().count(); } }
失败的测试用例
testIsogramWithDuplicatedCharAfterHyphen() { assertThat(isogramChecker.isIsogram("thumbscrew-jappingly")).isFalse(); }
失败原因解析
这个测试用例失败的核心原因是代码处理非字母字符的逻辑完全错误:
- 测试字符串
"thumbscrew-jappingly"中包含连字符-,同时字符串内存在重复字母p("jappingly"里有两个p),按照Isogram的规则,这个字符串不是Isogram,预期返回false。 - 但代码在遍历到连字符
-时,直接执行return true,跳过了后续的重复字母检查,错误地返回了true,与测试预期的false不符,导致测试失败。
除此之外,代码还有两处明显的逻辑问题:
- 第三个条件
ch == '_' & ch == ' ' || ch == '-'完全无效:单个字符不可能同时等于_和空格,且使用了按位与&而非逻辑与&&,这个条件永远不会触发。 - 对非字母字符的处理逻辑错误:Isogram判断中,连字符、空格等非字母字符应该被忽略,而非直接判定字符串为Isogram(返回
true)。正确的逻辑应该是跳过这些字符,只检查字母是否重复。
内容的提问来源于stack exchange,提问作者user16790478
相关产品推荐
相关产品推荐

