在第一个的情况下assert
,错误消息可以提示问题出在哪里:
Assertion failed:
assert words.size() == 16
| | |
| 14 false
[
line1:, 50, 65, 42
line2:, 123, 456, 352, 753, 1825
line3:, 10, 25, 20, 48, 107
]
那里缺少一些逗号,并且words
打印值的方式似乎是错误的。正在发生的事情是input.split(/ /)
用空格分割输入字符串,但是,因为它还包含换行符,所以有些单词没有被分割,例如,'42\nline2:'
.
为了更清楚地看到这一点,我们可以使用该inspect
方法,它为我们提供了一个具有对象文字形式的字符串:
println input.inspect()
// --> '\nline1: 50 65 42\nline2: 123 456 352 753 1825\nline3: 10 25 20 48 107\n'
println input.split(/ /).inspect()
// --> ['\nline1:', '50', '65', '42\nline2:', '123', '456', '352', '753', '1825\nline3:', '10', '25', '20', '48', '107\n']
用空格分割单词 Groovy 添加了一个方便的非参数化split
方法:
def words = input.split()
assert words.size() == 16
println words.inspect()
// --> ['line1:', '50', '65', '42', 'line2:', '123', '456', '352', '753', '1825', 'line3:', '10', '25', '20', '48', '107']
要获取字符串的行,您可以使用readLines
.
def lines = input.readLines()
println lines.inspect()
// --> ['', 'line1: 50 65 42', 'line2: 123 456 352 753 1825', 'line3: 10 25 20 48 107']
但是请注意,这readLines
将返回四个元素,因为有第一个空行(我不知道为什么它会忽略最后一个空行),所以assert lines.size() == 3
仍然会失败。
您可以使用结果列表过滤掉那些空行Collection#findAll()
,或者直接调用String#findAll(Pattern)
输入字符串:
def lines = input.readLines().findAll()
assert lines.size() == 3
def lines2 = input.findAll(/\S+/)
assert lines2.size() == 3
assert lines == lines2