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

有人可以解释一下它是如何工作的吗?

最佳答案

JavaDoc来看,它的行为符合预期:

成功找到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
  • 等...
  • 关于java - 了解扫描仪的findWithinHorizo​​n方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40200401/

    10-13 04:11