Classe Scanner

di il
6 risposte

Classe Scanner

Ciao a tutti, sono alle prime armi con java e già alle prese con un problema che in realtà dovrebbe essere abbastanza semplice, cioè l'interazione con l'utente e in particolare la lettura di stringhe da console. Per fare ciò ho letto che si può usare la classe Scanner. Io ho provato a fare così: (in realtà mancano le classi Cd_musicale, Cd_software e Song ma contengono solo i costruttori)

import java.util.*;

public class Cd {
	String titolo;
	int anno_pubb;
	static Cd_musicale[] coll_mus = new Cd_musicale[100];
	static Cd_software[] coll_softw = new Cd_software[100];
	static int num_mus=0, num_softw=0;

	public Cd() {

	}

	public static void search(String title) {
		boolean trovato=false;
		System.out.println("Ricerca di \"" + title + "\" tra i " + num_mus + " CD.");
		for(int i=0; i<num_mus; i++) {
			if(coll_mus[i].titolo.compareToIgnoreCase(title) == 0) {
				trovato=true;

				// variabili di appoggio
				String titolo_trov = coll_mus[i].titolo;
				int anno_trov = coll_mus[i].anno_pubb;

				//stampo i risultati
				System.out.println("L'anno di pubblicazione del CD \"" + titolo_trov + "\" è " + anno_trov);
			}
		}
		System.out.println(trovato ? "Ricerca completata con successo." : "CD non trovato.");
	}

	public static void insertMusic() {
		Scanner scan = new Scanner(System.in);

		System.out.print("Inserire il titolo: ");
		String titolo_new = scan.nextLine();

		System.out.print("Inserire l'autore: ");
		String autore_new = scan.nextLine();

		System.out.print("Inserire la casa discografica: ");
		String casa_new = scan.nextLine();

		System.out.print("Inserire l'anno di pubblicazione: ");
		int anno_new = scan.nextInt();
		

		Cd_musicale disc_new = new Cd_musicale(titolo_new, autore_new, casa_new, anno_new);
		coll_mus[num_mus]=disc_new;
		num_mus++;

		System.out.println("Nuovo CD inserito con successo. Ora ci sono " + num_mus + " CD nella collezione.");
	}



	public static void main(String[] args) {
		num_mus=0;
		num_softw=0;
		Scanner sc = new Scanner(System.in);

		Song disc1_track1 = new Song("Hells Bells", 5, 13);
		Song disc1_track2 = new Song("Shoot to Thrill", 5, 18);
		Song disc1_track3 = new Song("What Do You Do for Money Honey?", 3, 36);

		Cd_musicale disc1 = new Cd_musicale("Back in Black", "ACDC", "Atco Records", 1980, disc1_track1, disc1_track2, disc1_track3);
		coll_mus[num_mus]=disc1;
		num_mus++;


		Cd_musicale disc2 = new Cd_musicale("Dire Straits", "Dire Straits", "Vertigo Records", 1978);
		coll_mus[num_mus]=disc2;
		num_mus++;

		Cd_software disc3 = new Cd_software("Windows 7 Home Premium 32 bit", "Microsoft", "Sistema operativo", 2009, "Windows");
		coll_softw[num_softw]=disc3;
		num_softw++;

		do {

			System.out.print("Inserire un nuovo CD musicale (1) o effettuare una ricerca per titolo (2)?  ");
			int risp = sc.nextInt();

			switch (risp) {
			case 1:
				insertMusic();
				break;
			case 2:
				System.out.print("Inserire il titolo da cercare: ");
				String inserimento = sc.nextLine();
				search(inserimento);
				break;
			case 0:
				System.out.println("Ciao ciao!");
				System.exit(0);
				break;
			}
		} while (1 != 0);
	}
}
ma non funziona e dà errore (per la verità di diversi tipi, anche perchè ho fatto parecchi tentativi ...)
Qualcuno può dirmi dove ho sbagliato con i vari scanner??
Grazie!!

6 Risposte

  • Re: Classe Scanner

    Forse ho trovato la soluzione... su un sito c'era scritto
    
    Oh, one last thing, don't try to scan text with nextLine(); AFTER using nextInt() with the same scanner! It doesn't work well with Java Scanner, and many Java developers opt to just use another Scanner for integers. You can call these scanners scan1 and scan2 if you want.
    
    Quindi ho provato a creare uno scanner apposito Scanner scInt per leggere gli interi e ora tutto sembra funzionare. Però mi sembra strano che oracle non lo segnali sulla pagina di documentazione sulla classe scanner...
    Se qualcuno ha altre idee.......
  • Re: Classe Scanner

    Ok scusate il triplo post ma ho un'altra domanda: prendendo per buono il post precedente ho modificato il codice così:
    
    import java.util.*;
    
    public class Cd {
    	String titolo;
    	int anno_pubb;
    	static Cd_musicale[] coll_mus = new Cd_musicale[100];
    	static Cd_software[] coll_softw = new Cd_software[100];
    	static int num_mus=0, num_softw=0;
    
    	public Cd() {
    
    	}
    
    	public static void search(String title) {
    		boolean trovato=false;
    		System.out.println("Ricerca di \"" + title + "\" tra i " + num_mus + " CD.");
    		for(int i=0; i<num_mus; i++) {
    			if(coll_mus[i].titolo.compareToIgnoreCase(title) == 0) {
    				trovato=true;
    
    				// variabili di appoggio
    				String titolo_trov = coll_mus[i].titolo;
    				int anno_trov = coll_mus[i].anno_pubb;
    
    				//stampo i risultati
    				System.out.println("L'anno di pubblicazione del CD \"" + titolo_trov + "\" è " + anno_trov);
    			}
    		}
    		System.out.println(trovato ? "Ricerca completata con successo." : "CD non trovato.");
    	}
    
    	public static void insertMusic() {
    		Scanner scan = new Scanner(System.in);
    
    		System.out.print("Inserire il titolo: ");
    		String titolo_new = scan.nextLine();
    
    		System.out.print("Inserire l'autore: ");
    		String autore_new = scan.nextLine();
    
    		System.out.print("Inserire la casa discografica: ");
    		String casa_new = scan.nextLine();
    
    		System.out.print("Inserire l'anno di pubblicazione: ");
    		int anno_new = scan.nextInt();
    
    		Cd_musicale disc_new = new Cd_musicale(titolo_new, autore_new, casa_new, anno_new);
    		coll_mus[num_mus]=disc_new;
    		num_mus++;
    
    		System.out.println("Nuovo CD inserito con successo. Ora ci sono " + num_mus + " CD nella collezione.");
    	}
    
    
    
    	public static void main(String[] args) {
    		num_mus=0;
    		num_softw=0;
    		Scanner sc = new Scanner(System.in);
    		Scanner scInt = new Scanner(System.in);
    
    		Song disc1_track1 = new Song("Hells Bells", 5, 13);
    		Song disc1_track2 = new Song("Shoot to Thrill", 5, 18);
    		Song disc1_track3 = new Song("What Do You Do for Money Honey?", 3, 36);
    
    		Cd_musicale disc1 = new Cd_musicale("Back in Black", "ACDC", "Atco Records", 1980, disc1_track1, disc1_track2, disc1_track3);
    		coll_mus[num_mus]=disc1;
    		num_mus++;
    
    
    		Cd_musicale disc2 = new Cd_musicale("Dire Straits", "Dire Straits", "Vertigo Records", 1978);
    		coll_mus[num_mus]=disc2;
    		num_mus++;
    
    		Cd_software disc3 = new Cd_software("Windows 7 Home Premium 32 bit", "Microsoft", "Sistema operativo", 2009, "Windows");
    		coll_softw[num_softw]=disc3;
    		num_softw++;
    
    		do {
    
    			System.out.print("Inserire un nuovo CD musicale (1) o effettuare una ricerca per titolo (2)?  ");
    			int risp = scInt.nextInt();
    
    			switch (risp) {
    			case 1:
    				insertMusic();
    				break;
    			case 2:
    				System.out.print("Inserire il titolo da cercare: ");
    				String inserimento = sc.nextLine();
    				search(inserimento);
    				break;
    			case 0:
    				System.out.println("Ciao ciao!");
    				System.exit(0);
    				break;
    			}
    
    		} while (1 != 0);
    	}
    }
    
    e sembra funzionare. Ma se volessi mettere dei metodi close per gli scanner (tipo sc.close()) DOVE li dovrei mettere?? Perchè appena provo a inserirli mi dà errore (in particolare un'eccezione ...NoSuchElement).
    Grazie ancora
  • Re: Classe Scanner

    Buongiorno a tutti,
    sono nuovo di questo forum ma soprattutto sono un super novellino riguardo a java.
    Ho iniziato da poco a usare java e ho trovato un esercizio k volevo risolvere ma ho delle difficoltà. Vorrei sapere se qualcuno può aiutarmi. Intanto spiego il problema, il testo dell'esercizio recita questo:
    Lettura di una sequenza di numeri inseriti manualmente dall'utente. Dopo aver digitato tutte le cifre che compongono il numero premere invio. L'utente può inserire una sequenza lunga a piacere e per indicare che la sequenza è terminata, premerà invio senza aver inserito alcuna cifra.
    Io riesco ad inserire i numeri a piacere ma non riesco a capire come posso fare capire k la sequenza è terminata premendo invio dopo non aver inserito nulla...
    Qualcuno sa dirmi qualcosa???
    Grazie in anticipo
  • Re: Classe Scanner

    Ciao,
    hai risposto a un mio post di due anni fa...
    Ti consiglio di aprire un nuovo thread per il tuo problema.

  • Re: Classe Scanner

    Come si fa?? scusa ma sn nuovo
  • Re: Classe Scanner

    Vai nella sezione Java (https://www.iprogrammatori.it/forum-programmazione/java/) e in alto a sinistra clicchi su "Nuovo argomento".
Devi accedere o registrarti per scrivere nel forum
6 risposte