[Java] Chiarimenti classe Scanner
Ciao a tutti, ho dei dubbi per quanto riguarda alcuni metodi della classe scanner. In particolare vorrei dei chiarimenti su quando devono essere utilizzati (e la loro funzione) dei seguenti metodi:
- next();
- nextLine();
- hasNext();
- hasNextLine().
Allora se ho ben capito i primi due metodi servono rispettivamente per leggere (ad esempio da un file di testo) una singola parola alla volta (next) e una riga alla volta(nextLine) fino a quando il testo non finisce.
I rimanenti due metodi non riesco a comprenderli.. So che si usano quando devo elaborare parola per parola (quindi effettuare la "tokenizzazione") però non mi è chiaro il loro funzionamento.
Spero nel vostro aiuto per chiarire i miei dubbi.
Grazie a tutti
- next();
- nextLine();
- hasNext();
- hasNextLine().
Allora se ho ben capito i primi due metodi servono rispettivamente per leggere (ad esempio da un file di testo) una singola parola alla volta (next) e una riga alla volta(nextLine) fino a quando il testo non finisce.
I rimanenti due metodi non riesco a comprenderli.. So che si usano quando devo elaborare parola per parola (quindi effettuare la "tokenizzazione") però non mi è chiaro il loro funzionamento.
Spero nel vostro aiuto per chiarire i miei dubbi.
Grazie a tutti
Risposte
Ciao, i metodi hasNext() e hasNextLine() semplicemente ti ritornano un valore booleano che ti dice se rispettivamente sono presenti nello stream di input elaborato dallo scanner un altro token (hasNext) o un'altra riga (hasNextLine).
Nota: I metodi next ti lanciano un'eccezione se non trovano nulla, quindi in teoria ti basterebbe gestire quella invece che aggiungere a mano un controllo con i metodi hasNext.
Nota: I metodi next ti lanciano un'eccezione se non trovano nulla, quindi in teoria ti basterebbe gestire quella invece che aggiungere a mano un controllo con i metodi hasNext.
La principale ragione di usare hasNext rispetto all'uso delle eccezioni si ha probabilmente quando sia necessario scegliere tra diverse alternative. Supponiamo ad esempio si abbia qualcosa come segue:
In questo testo esistono due forme di "ROTATE". La prima prende un angolo e una stringa tra X, Y e Z mentre la seconda prende un angolo e i tre coefficienti dell'asse. Se si vuole fare il parsing di questa riga può essere utile usare hasNextDouble (o qualcosa del genere) per distinguere tra i due casi.
Le eccezioni sono invece probabilmente meglio nel caso in cui ci sia una singola alternativa e in cui quindi il fallimento del parsing sia un errore nell'input. In questo caso usare hasNext porterebbe in pratica a fare il parsing due volte di ogni cosa senza alcun reale vantaggio.
ROTATE 45 X ROTATE 30 1 0 1
In questo testo esistono due forme di "ROTATE". La prima prende un angolo e una stringa tra X, Y e Z mentre la seconda prende un angolo e i tre coefficienti dell'asse. Se si vuole fare il parsing di questa riga può essere utile usare hasNextDouble (o qualcosa del genere) per distinguere tra i due casi.
Le eccezioni sono invece probabilmente meglio nel caso in cui ci sia una singola alternativa e in cui quindi il fallimento del parsing sia un errore nell'input. In questo caso usare hasNext porterebbe in pratica a fare il parsing due volte di ogni cosa senza alcun reale vantaggio.
Grazie mille per le risposte, siete stati molto chiari