了解Scanner的findWithinHorizo​​n方法

时间:2016-10-23 06:56:58

标签: java java.util.scanner

我正在尝试使用和理解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。

有人可以解释这是如何运作的吗?

1 个答案:

答案 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
  • 等......