Visualizzazione dei risultati da 1 a 10 su 10

Discussione: problema Scanner in

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    108

    problema Scanner in

    Ragazzi mi potete spiegare come funziona il metodo hasNextLine() della classe Scanner???
    cioè se io inserisco ogni volta da standard di input delle stringhe come faccio a dire al programma di terminare e di eseguire le varie operazioni espresse nel main??

    codice:
    public static void main(String[] args) {
    	Scanner in = new Scanner(System.in);
    		
    	while(in.hasNextLine()){
    		String lineaInput = in.nextLine();
    		System.out.println(lineaInput);
    	}
    }
    questo codice non termina mai...come faccio a dire che deve terminare senza mettere tipo una stringa "END" da input???

  2. #2
    Utente di HTML.it L'avatar di Dark867
    Registrato dal
    Mar 2010
    Messaggi
    435
    Se vuoi semplicemente leggere l'input da tastiera fai così:
    codice:
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    String rec;
    while((rec=in.readLine()).length() != 0)
    //fa qualcosa;
    In pratica il while esce quando premi invio senza aver scritto nulla.
    edit: ho modificato il codice sopra.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    108
    grazie per la risp...il mio problema è questo:
    quello che ti posto è la soluzione ad un esercizio fatta dal mio professore e non capisco una cosa...
    codice:
    while(in.hasNextLine()){
    	String lineaInput = in.nextLine();
    	StringTokenizer stk = new StringTokenizer(lineaInput,"#");
    	String nome = stk.nextToken();
    	maxLength = Math.max(nome.length(),maxLength);
    	int cfu = Integer.parseInt(stk.nextToken());
    	Esame esame = null;
    	if(!stk.hasMoreTokens())
    		esame = new Esame(nome,cfu);
    	else{
    		int voto = Integer.parseInt(stk.nextToken());
    		if(voto <=30)
    			esame = new Esame(nome,cfu,voto);
    		else{
    			esame = new Esame(nome,cfu,30);
    			esame.setConLode();
    			voto = valoreLode;
    		}
    		sommaCFU = sommaCFU + cfu;
    		sommaPesataVoti += voto*cfu; 	
    	}
    	esami[count] = esame;
    	count++;
    }
    e l'imput e questo...
    codice:
    architettura degli elaboratori I#6#27
    matematica del continuo#12#24
    programmazione#12#28
    architettura degli elaboratori II#6#40
    fisica#6#22
    lingua inglese: corso base#3
    matematica del discreto#9
    algoritmi e strutture dati#12#24
    basi di dati#12
    calcolo delle probabilita' e statistica matematica#6
    linguaggi formali e automi#6#25
    sistemi operativi I#6#31
    sistemi operativi II#6
    progettazione del software#12
    reti di calcolatori#12#25
    praticamente ho anche una classe Esame che costruisce l'esame...cmq non riesco a farlo terminare cioè che mi chiede sempre una linea nuova e se premo invio senza scrivere nulla va in eccezione...non riesco a capire io come funziona o è sbagliato l'esercizio???

  4. #4
    Utente di HTML.it L'avatar di Dark867
    Registrato dal
    Mar 2010
    Messaggi
    435
    La classe Scanner è fatta per esaminare le righe di un file di testo, quindi l'input del tuo esercizio deve essere contenuto in un file .txt, infatti credo che hasNextLine() vada alla ricerca dello speciale carattere EOF (end of file) per restituire true o false.

    Non è la migliore scelta per leggere un flusso dinamico, cioè un flusso in cui la dimensione massima non è definita e che in generale non si sa quando e se finisce, come ad esempio l'input da tastiera. In questo caso è meglio usare un buffered reader come t ho fatto vedere io.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    108
    La cosa strana è che nel testo dell'esercizio dice di usare uno standard input...
    codice:
    La classe  PianoDiStudi legge da standard input una sequenza di linee della forma
    
    nome_esame#cfu
    
    oppure
    
    nome_esame#cfu#voto
    
    
    dove nome_esame e' il nome dell'esame, cfu il numero di crediti, voto il voto.
    appunto mi risultava strano

  6. #6
    Utente di HTML.it L'avatar di Dark867
    Registrato dal
    Mar 2010
    Messaggi
    435
    Non ho mai provato a usare scanner così...sei vincolato a usare questa classe?

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    108
    quindi mi risulta strano che la sua soluzione sia esatta...io cmq ho messo l'input in un file di testo e l'esercizio è esatto...

  8. #8
    lo Scanner viene usato per leggere file ed effettuare operazioni particolari sul file letto e difficilmente come standard input.
    La soluzione migliore è quella suggeritati da Dark867.
    I miei esempi in Java qui: http://cdpjavaexamples.altervista.org/index.html

  9. #9
    Originariamente inviato da Naruto 92
    lo Scanner viene usato per leggere file ed effettuare operazioni particolari sul file letto e difficilmente come standard input.
    La classe Scanner è usata anche e soprattutto per la lettura di un InputStream.
    In questo caso, l'uso che si fa dei metodi non è propriamente corretto, quindi si può risolvere in questo modo:
    codice:
    String lineaInput = null;
    while( !(lineaInput = in.nextLine()).trim().equals("") ){
             ...
    }

  10. #10
    Utente di HTML.it L'avatar di Dark867
    Registrato dal
    Mar 2010
    Messaggi
    435
    Il fatto che occorra scrivere un codice così sporco a me sembra la prova evidente che Scanner non sia proprio fatto per l'InputStream...anche un novizio di java leggendo la documentazione si rende conto che è una classe fatta per leggere file di testo, vorrei conoscere chi lo usa "anche e soprattutto" per InputStream, preferendolo ad altre classi più specializzate :S

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.