Java Scanner hasNext () nasuprot hasNextLine ()

1. Pregled

The Skener class je praktičan alat koji može raščlaniti primitivne tipove i nizove pomoću regularnih izraza i uveden je u java.util paket u Javi 5.

U ovom kratkom vodiču razgovarat ćemo o njegovom hasNext () i hasNextLine () metode. Iako ove dvije metode isprva mogu izgledati prilično slično, zapravo provode sasvim različite provjere.

U kratkom vodiču ovdje možete pročitati i više o svestranoj klasi skenera.

2. hasNext ()

2.1. Osnovna upotreba

HasNext () metoda provjerava je li Skener ima još jedan token u svom ulazu. A Skener razbija svoj ulaz u tokene pomoću uzorka graničnika, koji se prema zadanim postavkama podudara s razmakom. To je, hasNext () provjerava unos i vraća pravi ako ima još jedan znak koji nije razmak.

Također bismo trebali primijetiti nekoliko detalja o zadanom graničniku:

  • Razmak ne uključuje samo razmak, već i prostor kartice (\ t), linijski feed (\ n), i još više znakova
  • Kontinuirani razmaci se tretiraju kao jedan graničnik
  • Prazni se redovi na kraju unosa ne ispisuju - to jest, hasNext () vraća se lažno za prazne retke

Pogledajmo primjer kako hasNext () radi sa zadanim graničnikom. Prvo ćemo pripremiti ulazni niz koji će nam pomoći da istražimo SkonzervaRezultat raščlanjivanja:

Niz INPUT = novi StringBuilder () .append ("magic \ tproject \ n") .append ("baza podataka: oracle \ n") .append ("zavisnosti: \ n") .append ("spring: foo: bar \ n ") .append (" \ n ") // Imajte na umu da unos završava praznim retkom .toString ();

Dalje, raščlanimo ulaz i ispišite rezultat:

Skener skenera = novi skener (INPUT); while (scanner.hasNext ()) {log.info (scanner.next ()); } log.info ("-------- IZLAZ - KRAJ ---------") 

Ako pokrenemo gornji kod, vidjet ćemo izlaz konzole:

[DEMO] magija [DEMO] projekt [DEMO] baza podataka: [DEMO] oracle [DEMO] ovisnosti: [DEMO] opruga: foo: bar [DEMO] -------- IZLAZ - KRAJ ----- ---- 

2.2. S prilagođenim graničnikom

Do sada smo pogledali hasNext () sa zadanim graničnikom. The Skener razred pruža a useDelimiter (uzorak niza) metoda koji nam omogućuje promjenu graničnika. Nakon što se promijeni graničnik, hasNext () metoda će provjeriti s novim graničnikom umjesto sa zadanim.

Pogledajmo još jedan primjer kako hasNext () i Sljedeći() radite s prilagođenim graničnikom. Ponovno ćemo upotrijebiti unos iz posljednjeg primjera.

Nakon što skener analizira token koji odgovara nizu “ovisnosti:“, Promijenit ćemo graničnik u dvotačku ( : ) kako bismo mogli raščlaniti i izdvojiti svaku vrijednost ovisnosti:

while (scanner.hasNext ()) {Tok niza = scanner.next (); if ("zavisnosti:". jednako (žeton)) {scanner.useDelimiter (":"); } log.info (token); } log.info ("-------- IZLAZ - KRAJ ---------");

Pogledajmo rezultirajući izlaz:

[DEMO] magija [DEMO] projekt [DEMO] baza podataka: [DEMO] oracle [DEMO] ovisnosti: [DEMO] opruga [DEMO] foo [DEMO] traka [DEMO] -------- IZLAZ - KRAJ- --------

Sjajno! Uspješno smo izdvojili vrijednosti u “ovisnosti“, Međutim, ima ih neočekivani problemi s prekidom crte. Vidjet ćemo kako to izbjeći u sljedećem odjeljku.

2.3. S regex kao Razdjelnik

Pogledajmo rezultate u zadnjem odjeljku. Prvo smo primijetili da postoji prekid retka (\ n) prije “Proljeće“. Promijenili smo graničnik u ":" nakon što "Ovisnosti:" dohvaćen je token. Prekid crte nakon "ovisnosti:”Sada postaje dio sljedećeg tokena. Stoga, hasNext () vratio pravi i ispisan je prijelom retka.

Iz istog razloga, dodavanje retka nakon "zimski san"I zadnji prazni redak postaju dijelom posljednjeg tokena, pa se ispisuju dva prazna retka zajedno s"zimski san“.

Ako za razgraničenje možemo napraviti i dvotačku i razmak, tada će vrijednosti "ovisnosti" biti pravilno raščlanjene i naš će problem biti riješen. Da bismo to postigli, promijenimo useDelimiter (“:”) poziv:

scanner.useDelimiter (": | \ s +"); 

": | \ s +”Ovdje je regularni izraz koji se podudara s jednim“: ”ili jednim ili više razmaka. Ovim popravkom izlaz se pretvara u:

[DEMO] magija [DEMO] projekt [DEMO] baza podataka: [DEMO] oracle [DEMO] ovisnosti: [DEMO] opruga [DEMO] foo [DEMO] traka [DEMO] -------- IZLAZ - KRAJ- --------

3. hasNextLine ()

The hasNextLine () metoda provjerava postoji li još jedan redak na ulazu Skener objekt, bez obzira je li redak prazan ili nije.

Uzmimo opet isti unos. Ovaj ćemo put dodati brojeve redaka ispred svakog retka u unosu pomoću hasNextLine () i nextLine () metode:

int i = 0; while (scanner.hasNextLine ()) log.info (String.format ("% d log.info (" -------- OUTPUT - END --------- ");

Pogledajmo sada naš izlaz:

[DEMO] 1 | čarobni projekt [DEMO] 2 | baza podataka: oracle [DEMO] 3 | ovisnosti: [DEMO] 4 | opruga: foo: bar [DEMO] 5 | [DEMO] -------- IZLAZ - KRAJ ---------

Kao što smo i očekivali, ispisuju se brojevi redaka, a tu je i posljednji prazni redak.

4. Zaključak

U ovom smo članku to naučili Skener‘S hasNextLine () metoda provjerava postoji li u retku drugi redak, bez obzira je li redak prazan ili ne, dok hasNext () koristi graničnik za provjeru drugog tokena.

Kao i uvijek, cjeloviti izvorni kod za primjere dostupan je na GitHubu.