我正在尝试使用和理解Java的Scanner#findWithinHorizon
方法。
我编写了以下使用此方法的代码,但我无法理解它是如何工作的。
private static void findWithinHorizon() {
String string = "Balkrishan Nagpal --> 1111, 2222, 3333";
Pattern pattern = Pattern.compile("[0-9]+");
Scanner scanner = new Scanner(string);
while (scanner.hasNext()) {
System.out.println("scanner.findWithinHorizon(pattern) = " + scanner.findWithinHorizon(pattern, 26));
}
}
当我运行上述方法时,我得到以下输出
scanner.findWithinHorizon(pattern) = 1111
scanner.findWithinHorizon(pattern) = 2222
scanner.findWithinHorizon(pattern) = 3333
但我希望输出只包含
scanner.findWithinHorizon(pattern) = 1111
因为我已将地平线值提供为26.
我的理解是,找到匹配结果扫描器时不会超出字符串中的索引26。
有人可以解释这是如何运作的吗?
答案 0 :(得分:9)
从JavaDoc开始按预期行事:
此方法搜索输入到指定的搜索范围,忽略分隔符。如果找到模式,扫描仪会超过匹配的输入,并返回与模式匹配的字符串。如果未检测到此类模式,则返回null并且扫描仪的位置保持不变。此方法可能会阻止等待与模式匹配的输入。
扫描仪永远不会搜索超出当前位置的地平线代码点。
成功找到1111
后,位置会提前到该比赛之后。下一次findWithinHorizon
通话会在第一场比赛后搜索最多26个字符。
scanner.hasNext()
返回true
当前位置。然后scanner.findWithinHorizon(pattern, 26)
搜索下一个26
模式的字符并返回它(同时推进当前
在比赛结束后的位置。)
所以你的代码如下:
0
。scanner.hasNext()
返回true,因为该字符串不仅包含空格。scanner.findWithinHorizon(pattern, 26)
搜索位置范围为0到26的模式,在位置22到25找到1111
,将新位置设置为26并返回1111
scanner.hasNext()
返回true,因为从第26位开始的字符串不仅包含空格scanner.findWithinHorizon(pattern, 26)
搜索位置范围26到52中的模式,在位置28到31找到2222
,将新位置设置为32并返回2222