此检查仍然失败。我分开了条件,所以我可以测试它们。它失败了cs =“WWWW”,“WXW”,“WWWWWWWWWWWWWWWW”
/**
* Check to ensure all lines are only composed of walls,
* entrance, exit, and space
*/
protected boolean invalidMazeCharacters(CharSequence cs) {
p = Pattern.compile("^W+R|X|\\s*W+$");
m = p.matcher(cs);
if (!m.matches()) {
return true;
}
return false;
}
答案 0 :(得分:2)
CharSequence cs = new String(line.toString());
在这里,你要创建一个数组的外观字符串。像“[C @ 333cb1eb”
这样的东西在线上放下'toString()',你可能会更近一步。
答案 1 :(得分:1)
您似乎误解了括号表示法[...]
的含义。它创建一个字符类,这意味着它只匹配一个字符,可能是...
中的任何字符。 (有许多特殊的语法可以更好地控制它可以匹配的字符,但这是基本的想法。)所以,例如,你的这种模式:
^W[W{10,20}R{1}]W$
要求字符串长度恰好为三个字符;第一个字符是W
;第二个字符是W
,{
,1
,0
,逗号,2
,}
,或R
;并且第三个字符是另一个W
。
在那种情况下,你真正应该写的只是:
^W+RW+$
确保字符串完全由W
组成,但只有一个R
,并且它以W
开头和结尾。 (你真的不需要担心W
的数量,因为到目前为止你已经确保字符串长度正好是22个字符。)
编辑添加:顺便说一句,你有单元测试很棒,但你的方法有一个如此狭窄的接口 - 它需要一个字符串,执行一堆验证,然后返回true
或false
- 它不适合单元测试。如果你的单元测试发现该方法错误地返回给定字符串的false
,那么你几乎没有关于出错的信息,所以找到问题没什么帮助。 (你已经亲眼见过了。)更糟糕的是,如果你的单元测试发现方法正确为给定的字符串返回false
,你还是无法确定它因正确的原因返回false
。因此,确保您的代码正确无济于事。有几种方法可以解决这个问题:
checkFileValidLine
将调用每个方法来验证该行。这样,您可以对这些方法进行单元测试(除了checkFileValidLine
的粗略单元测试,以确保它调用这些方法并返回正确的结果)。 (这是我推荐的方法。)true
而对于无效字符串返回false
,而是返回{{1} }表示有效字符串;(例如)null
表示无效字符串。然后,您的单元测试可以确保完全触发正确的验证规则,而"line.length != 22"
如果该辅助方法返回checkFileValidLine
则可以返回true
。 / LI>