Понимание метода findWithinHorizon сканера

Я пытаюсь использовать и понимать 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 ответов


С JavaDoc он ведет себя, как ожидалось:

этот метод выполняет поиск по входу до указанного горизонта поиска, игнорируя разделители. Если шаблон найден сканер продвигается мимо ввода, который соответствовал и возвращает строку, соответствующую шаблону. Если такой шаблон не обнаружен, возвращается значение null и положение сканера остается неизменным. Этот метод может блокировать ожидание ввода, соответствующего узор.

сканер никогда не будет искать больше, чем кодовые точки горизонта за пределами его текущей позиции.

после успешного нахождения 1111 позиция выдвинута сразу после этого матча. Следующий findWithinHorizon поиск абонента через максимум 26 символов после первого матча.


scanner.hasNext() возвращает true, если есть что-то еще, кроме пробелов после текущее положение. scanner.findWithinHorizon(pattern, 26) затем ищет следующий Двадцать шесть символы для шаблона и возвращает его (в то же время продвижение текущего позиция сразу после матча).

таким образом, ваш код продолжается следующим образом:

  • создание сканера: текущая позиция 0.
  • scanner.hasNext() возвращает true, так как строка содержит не только пробелы.
  • scanner.findWithinHorizon(pattern, 26) ищет шаблон в диапазоне позиций от 0 до 26, находит 1111 в позициях с 22 по 25 устанавливает новое положение в 26 и возвращает 1111
  • scanner.hasNext() возвращает true, так как строка, начинающаяся с позиции 26, содержит не только пробелы
  • scanner.findWithinHorizon(pattern, 26) поиск шаблона в диапазоне позиций от 26 до 52, находит 2222 в позициях с 28 по 31 устанавливает новую позицию в 32 и возвращает 2222
  • и так далее...