Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    50

    [JAVA] Problema con nextLine() di Scanner

    Salve a tutti, sto implementando una classe che si chiama Libretti. La traccia è questa:

    gli studenti hanno un libretto per il primo semestre e un libretto per il secondo semestre,
    sui libretti vanno scritti il nome degli insegnamenti sostenuti, le date(gg/mm/aaaa) degli esami,il voto e i CFU.

    Creare quindi un menù per la scelta tra:

    1)Inserimento dei dati per il popolamento dei libretti da input.

    2)Ordinamento (a scelta) in base al nome dell'insegnamento per ogni libretto.

    3)Fusione dei due libretti in un unico libretto annuale(attraverso il metodo merge(NON MERGESORT)e stampa del libretto annuale.

    Ps:Stampa dei libretti sia dopo l'acquisizione dei dati sia dopo l'ordinamento.
    Questa è la classe:

    codice:
    public class Libretto {
    
    	/**
    	 * gli studenti hanno un libretto per il primo semestre 
    	 * e un libretto per il secondo semestre. 
    	 * sui libretti vanno scritti il nome degli insegnamenti
    	 * sostenuti, le date(gg/mm/aaaa) degli esami,il voto 
    	 * e i CFU.
    	 */
    	
    	//Costruttore oggetti della classe
    	public Libretto(String mater, String date, int mark, int CFU)
    	{
    		materia=mater;
    		data=date;
    		voto=mark;
    		cfu=CFU;
    	}
    	
    	public String getSub()
    	{
    		return materia;
    	}
    	public void setSub(String v)
    	{
    		materia=v;
    	}
    	//___________________________________
    	public String getData()
    	{
    		return data;
    	}
    	public void setData(String v)
    	{
    		data=v;
    	}
    	//________________________________
    	public int getVoto()
    	{
    		return voto;
    	}
    	public void setVoto(int v)
    	{
    		voto =v;
    	}
    	//______________________________
    	public int getCfu()
    	{
    		return cfu;
    	}
    	public void setCfu(int v)
    	{
    		cfu =v;
    	}
    	//________________________________
    	
    	//metodo ordinamento per materia
    	//(INSERTION SORT)
    	
    	public static void ordSub(Libretto[] v)
    	{
    		Libretto temp;
    		for (int i=1; i<v.length;i++)
    		{
    			for(int j=i;j>0;j--)
    			{
    				if((v[j].materia).compareToIgnoreCase(v[j-1].materia)<0)
    				{
    					temp=v[j];
    					v[j]=v[j-1];
    					v[j-1]=temp;
    				}
    			}
    		}
    	}
    	
    	//___________________________________
    	//Metodo che stampa
    	public static void stampa(Libretto[] array)
    	{
    		for(int i=0;i<array.length;i++)
    		{
    			System.out.println(array[i].materia+", "+array[i].data+", "
    					+array[i].voto+", "+array[i].cfu);
    		}
    	}
    	//____________________________________
    	//Fusione dei due libretti in un unico libretto annuale
    	//(prima primo semestre, poi secondo semestre)
    	public static void merge(Libretto[]v1, Libretto[]v2, Libretto[]nuovo)
    	{
    		nuovo = new Libretto[v1.length+v2.length];
    		System.arraycopy(v1, 0, nuovo, 0, v1.length);
    		System.arraycopy(v2, 0, nuovo, v1.length, v2.length);
    	}
    
    	
    //campi esemplare
    	private String materia;
    	private String data;
    	private int voto;
    	private int cfu;
    
    }
    E questo il codice del tester:

    codice:
    import java.util.Scanner;
    
    
    public class Libretto_tester {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		int scelta;
    		Libretto[] lib1 = new Libretto[3];
    		Libretto[] lib2 = new Libretto[4];
    		Scanner in=new Scanner(System.in);
    do
    	{
    		//MENU PER LA SCELTA DELLE AZIONI
    		
    		System.out.println("Scegli tra le seguenti azioni: "
    				+"\n[1]Inserimento dei dati per il popolamento dei libretti da input."
    				+"\n[2]Ordinamento in base al nome dell'insegnamento per ogni libretto."
    				+"\n[3]Fusione dei due libretti in un unico libretto annuale");
    		
    		scelta = in.nextInt();
    		
    	switch(scelta)
    	{
    		case 1: 
    			lib1 = new Libretto[3];
    			//___________________________
    			System.out.println("PRIMO LIBRETTO: ");
    			for (int i=0;i<lib1.length;i++){
    			System.out.println("Inserire Materia "+(i+1)+": ");
    			String materia = in.nextLine();
    			System.out.println("Inserire Data "+(i+1)+": ");
    			String data = in.nextLine();
    			System.out.println("Inserire Voto "+(i+1)+": ");
    			int voto = in.nextInt();
    			System.out.println("Inserire CFU "+(i+1)+": ");
    			int cfu = in.nextInt();
    			//immetto nell'oggetto materia 1 i dati acquisiti
    			Libretto sub = new Libretto(materia,data,voto,cfu);
    			lib1[i]=sub;
    			}//fine del for
    			//__________________________________________
    			lib2 = new Libretto[4];
    			//___________________________
    			System.out.println("SECONDO LIBRETTO: ");
    			for (int i=0;i<lib2.length;i++){
    			System.out.println("Inserire Materia "+(i+1)+": ");
    			String materia = in.nextLine();
    			System.out.println("Inserire Data "+(i+1)+": ");
    			String data = in.nextLine();
    			System.out.println("Inserire Voto "+(i+1)+": ");
    			int voto = in.nextInt();
    			System.out.println("Inserire CFU "+(i+1)+": ");
    			int cfu = in.nextInt();
    			//immetto nell'oggetto materia 1 i dati acquisiti
    			Libretto sub = new Libretto(materia,data,voto,cfu);
    			lib2[i]=sub;
    			}//fine del for
    			
    			//STAMPA (PRIMA DELL'ORDINAMENTO
    			System.out.println("__Libretto primo semestre:__ ");
    			Libretto.stampa(lib1);
    			System.out.println("__Libretto secondo semestre:__ ");
    			Libretto.stampa(lib2);
    			break;
    			
    		case 2:
    			Libretto.ordSub(lib1);
    			System.out.println("LIBRETTO PRIMO SEMESTRE ORDINATO PER MATERIA: ");
    			Libretto.stampa(lib1);
    			
    			Libretto.ordSub(lib2);
    			System.out.println("LIBRETTO SECONDO SEMESTRE ORDINATO PER MATERIA: ");
    			Libretto.stampa(lib2);
    			break;
    			
    		case 3:
    			System.out.println("FUSIONE DEI DUE LIBRETTI: ");
    			Libretto[] annuale = new Libretto[7];
    			Libretto.merge(lib1, lib2, annuale);
    			Libretto.stampa(annuale);
    			
    	
    	}
    	}while(scelta!=4);
    	
    	System.out.println("Programma terminato!");	
    		
    
    		
    
    	}
    
    }
    Il mio problema è questo:appena lancio il programma e inserisco la scelta 1, il computer mi chiede contemporaneamente Materia 1 e data 1, con la possibilità di scrivere una sola cosa. Appena premo invio poi mi chiede voto 1 separatamente e infine cfu 1.
    Come posso risolvere?

    __________________________________________________ ________
    EDIT: P.s. se può essere utile, ho notato che il problema non è nella nextLine :/ Ho provato a cambiare l'ordine degli input ma a prescindere da questo, mi chiede sempre le prime due insieme. Anche voto 1 e data 1, per esempio. Io ho eseguito tutto il case, ed effettivamente l'array lo riempie, ma ovviamente lascia vuoto il campo della prima scelta, perchè giustamente non lo si riesce a riempire.

    __________________________________________________ __________
    EDIT2: Scusate per il doppio edit, ma nel frattempo continuavo a provare. Dovrei aver risolto. Ho usato in.next() invece di nextLine per le stringhe..e a desso sembra funzionare. Ma qualcuno mi spiega come mai? E' la prima volta che ho problemi di quest genere :/

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Vediamo come funzionano i metodi della classe Scanner:

    nextInt(): ritorna un valore intero dato dalla parserizzazione (decodifica) del testo presente dall'inizio dello stream fino al primo carattere di newLine escluso. Di conseguenza, se io scrivo 1 e premo invio, la classe Scanner parserizza il carattere '1', mi restituisce l'intero corrispondenza e lascia nel "buffer" il mio INVIO (newLine). Questo carattere di newLine verrà preso in considerazione alla prossima lettura (dove viene richiesto "Materia 1"). E' come se tu, alla richiesta della Materia 1 avessi risposto premendo semplicemente INVIO.

    next(): ritorna il prossimo token, ovvero tutto ciò che è presente nello stream dall'inizio fino al prossimo delimitatore (che, di default, è un qualunque carattere bianco: spazi, tabs, newLine, ecc).

    Il mio consiglio è quello di gestire meglio l'input: leggere sempre tutta la riga usando nextLine() e solo successivamente fare le dovute considerazioni (conversioni ad intero oppure no). In questo modo, il carattere di newLine che viene inserito nello stream dal tasto INVIO viene di volta in volta mangiato e non considerato, lasciando il buffer di input sempre bello pulito.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    50
    Grazie mille per la risposta esauriente DD

    P.s. ho un altro problema con questa classe, però non riguarda l'argomento del topic. QUindi sto aprendo un altro post, spero di fare bene

    grazie ancora

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.