2016-10-23 12 views
5

Próbuję użyć i zrozumieć metodę Java Scanner#findWithinHorizon.Opis metody findWithinHorizon skanera

Napisałem następujący fragment kodu, który używa tej metody, ale nie jestem w stanie zrozumieć, jak to działa.

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)); 
    } 
} 

Kiedy uruchomić powyższą metodę, otrzymuję następujący wynik

scanner.findWithinHorizon(pattern) = 1111 
scanner.findWithinHorizon(pattern) = 2222 
scanner.findWithinHorizon(pattern) = 3333 

ale spodziewałbym wyjściowe zawierają tylko

scanner.findWithinHorizon(pattern) = 1111 

jakom pod warunkiem że wartość horyzont jak 26

Mam świadomość, że znalezienie zgodnego skanera wyniku nie wykracza poza indeks 26 w ciągu.

Czy ktoś może wyjaśnić, jak to działa?

Odpowiedz

9

Z JavaDoc zachowuje się zgodnie z oczekiwaniami:

Metoda ta przeszukuje wejścia do określonego horyzontu wyszukiwania, ignorując ograniczniki. Jeśli wzorzec zostanie znaleziony, skaner przesunie się poza wejście, które pasuje do i zwraca ciąg zgodny z wzorcem. Jeśli nie zostanie wykryty taki wzorzec, zwracana jest wartość zerowa, a położenie skanera pozostaje niezmienione. Ta metoda może blokować oczekiwanie na dane wejściowe pasujące do wzorca.

Skaner nigdy nie wyszukuje więcej niż punkty kodowania horyzontu poza swoją aktualną pozycją.

Po znalezieniu 1111 pozycja zostaje przesunięta do tuż po tym meczu. Następne połączenie findWithinHorizon wyszukuje maksymalnie 26 znaków po pierwszym dopasowaniu.


scanner.hasNext() Zwraca true, jeśli istnieje coś innego niż spacji po aktualnej pozycji . scanner.findWithinHorizon(pattern, 26) następnie przeszukuje kolejne 26 znaków wzoru i zwraca go (jednocześnie przesuwając bieżącą pozycję tuż po meczu).

Więc kod przebiega następująco:

  • Tworzenie skanera: aktualna pozycja jest 0.
  • scanner.hasNext() zwraca true, ponieważ ciąg zawiera nie tylko białe znaki.
  • scanner.findWithinHorizon(pattern, 26) wyszukuje wzorca w zakresie pozycji od 0 do 26, znajduje 1111 w pozycjach 22 do 25, wyznacza nową pozycję do 26 i powraca 1111
  • scanner.hasNext() powraca prawdziwe, ponieważ ciąg zaczynając w pozycji 26 nie zawiera tylko odstępu
  • scanner.findWithinHorizon(pattern, 26) wyszukuje wzorca w zakresie pozycji 26 do 52, znajduje 2222 w pozycjach 28 do 31, ustala nową pozycję do 32 i zwraca 2222
  • i tak dalej ...
+0

, czy to znaczy, że po znalezieniu liczb nadal szuka 26 znaków i przestaje szukać wzorca? –

+0

@ShreyasSarvothama Skaner zatrzymuje wyszukiwanie natychmiast, w miejscu zaraz po znalezieniu dopasowania. Ale twój kod jest w pętli 'while', więc jest wykonywany wielokrotnie i przesuwa się za każdym razem. 'scanner.hasNext()' zwraca true, o ile jest więcej danych do odczytania. Ponieważ skaner zatrzymuje się po dopasowaniu, a nie na końcu łańcucha, jest jeszcze więcej danych do odczytania po znalezieniu '1111'. – nbrooks

+0

@ ThomasKläger dzięki za szczegółowe wyjaśnienie. jeśli zobaczysz kod i uruchom go ... to wydrukuje 3333 dla trzeciej pętli. Więc kiedy powiesz w drugiej pętli, że skanuje od 26 do 52, powinien wydrukować zarówno 2222, jak i 3333, czyż nie? Czuję, że ... skoro skaner jest oddzielony spacją, dopóki warunek nie jest fałszywy, to wciąż znajduje wzór? –