Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442

    [ArrayList] Cercare in un arraylist con input da file

    Ciao,
    sto impazzendo con un esercizio che mi chiede di scrivere un programma che legge in input un file di testo contenente righe tipo questa:
    01 Bologna BLQ Roma FCO Alitalia 15:00 16:00
    e chiede iterativamente all'utente di quale città vuole informazioni sui voli in partenza e in arrivo per quella città, stampando a video i risultati richiesti.
    Dunque ho creato la classe Voli che definisce tutte le variabili di classe e i costruttori relativi con metodi set e get, e quella è banale e ve la risparmio.
    Sono riuscita a creare l'arraylist e riempirlo con i valori messi in input dal file (tramite Scanner), il programma funziona ma solo in parte, infatti qualunque città io metta in input non mi restituisce nessun risultato ma mi continua a chiedere quale città voglio finché non premo il carattere di escape.

    Vi copincollo il pezzo di codice in cui secondo me ho il problema:

    codice:
    private static void startInterfaccia() {
    		// stabilisco una variabile di controllo per verificare se l'utente ha annullato l'operazione
    		boolean utenteAnnulla=false;
    		do {
    			Scanner utenteInput=new Scanner(System.in);
    			System.out.println("Quale volo vuoi cercare? (premi q per terminare)");
    			String cittaCercata=utenteInput.nextLine();
    			if (!cittaCercata.equals("q")) {
    				for (int i=0; i<listVoli.size() && cittaCercata==null; i++) {
    					Voli thisVolo=listVoli.get(i);
    					if (cittaCercata != null && !thisVolo.getCittPart().equals(cittaCercata))
    						System.out.println(listVoli.get(i));
    					else
    						System.out.println("Non ci sono voli per quella citta'!");
    				}
    			}
    			else
    				utenteAnnulla=true;
    		}
    		while (!utenteAnnulla);
    	}
    Se serve posso postare il resto del codice, ma sostanzialmente dopo questo c'e' il main che fa partire il programma chiedendo in input il nome del file in cui cercare, mentre prima c'e' la deifnizione dell'oggetto scanner in un arrayList in cui confluiscono i dati letti in input riga per riga.
    Qualcosa mi sfugge di sicuro
    Grazie!

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    dovresti togliere questo:
    "&& cittaCercata==null"

    P.S. fatto ciò funzionerà, quel codice è comunque miglorabile, ci penserai tu col tempo.

    Ciao.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    ciao, avevo già provato, ma ottengo questo risultato:

    Quale volo vuoi cercare? (q per terminare)
    Roma (-->mio input)
    (risultato
    001 Bologna BLQ FCO Alitalia 15:00 16:00
    Non ci sono voli per quella citta'!
    003 Palermo PMO CMO Meridiana 08:00 03:00
    004 NewYork JFK GTW RyanAir 06:00 13:00
    005 Parigi BBE BLQ RyanAir 16:00 15:00
    001 Bologna BLQ FCO Alitalia 15:00 16:00
    Non ci sono voli per quella citta'!
    003 Palermo PMO CMO Meridiana 08:00 03:00
    004 NewYork JFK GTW RyanAir 06:00 13:00
    005 Parigi BBE BLQ RyanAir 16:00 15:00

    e ricomincia con Quale volo vuoi cercare? (q per terminare)

    Quindi in pratica mi stampa la riga in cui ha trovato una corrispondenza (togliendo però dalla riga la corrispondenza**, chissà perché!) piu' non so che altro combina...

    Questo è il contenuto del file da cui si estraggono i dati:
    001 Bologna BLQ Roma FCO Alitalia 15:00 16:00
    002 Roma FCO Firenze FCU AirFrance 16:30 18:00
    003 Palermo PMO Como CMO Meridiana 08:00 03:00
    004 NewYork JFK London GTW RyanAir 06:00 13:00
    005 Parigi BBE Bologna BLQ RyanAir 16:00 15:00

    Quindi l'output corretto a un input Roma doveva essere la stampa di queste sole righe:
    001 Bologna BLQ Roma FCO Alitalia 15:00 16:00
    002 Roma FCO Firenze FCU AirFrance 16:30 18:00

    grazie!

    **risolto: nel ridefinire il metodo toString avevo dimenticato la città di destinazione

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    CE L'HO FATTA !!! Finalmente mi sembra funzioni a dovere!! Ci ho sbattuto un po' la testa ma è stato meglio così!
    Ora mi dareste un giudizio sul codice (la traccia da svolgere è all'inizio di questo topic)? Si poteva fare meglio? E come? Grazie!

    codice:
    import java.io.*;
    import java.util.*;
    class GestVoli {
    	// definisco un arraylist di tipo definito dalla classe Voli
    	private static ArrayList<Voli> listVoli= new ArrayList<Voli>();
    	private static boolean caricaVoli(String nomeFile) {
    		try {
    			//costruisco l'oggetto scanner in cui confluiranno i dati del file
    			Scanner scanFile=new Scanner(new File(nomeFile));
    			int i=1;
    			while (scanFile.hasNext()) {
    				try {
    					String idVolo=scanFile.next();
    					String cittPart=scanFile.next();
    					String aPart=scanFile.next();
    					String cittDest=scanFile.next();
    					String aDest=scanFile.next();
    					String compagnia=scanFile.next();
    					String orPart=scanFile.next();
    					String orArr=scanFile.next();
    					listVoli.add(new Voli(idVolo, cittPart, aPart, cittDest, aDest, compagnia, orPart, orArr));
    					i++;
    				}
    				catch (IllegalArgumentException e) {
    					System.out.println("La riga n. " + i + " non ha i parametri giusti");
    				}
    			}
    		}
    		catch (FileNotFoundException e) {
    			System.out.println("Il file " + nomeFile + " non esiste o non e' nel percorso giusto!");
    		}
    		if (listVoli.size()>0)
    			return true;
    		else
    			return false;
    	}
    	// inizio metodo che interagisce con l'utente
    	private static void startInterfaccia() {
    		// stabilisco una variabile di controllo per verificare se l'utente ha annullato l'operazione
    		boolean utenteAnnulla=false;
    		do {
    			Scanner utenteInput=new Scanner(System.in);
    			System.out.println("Quale volo vuoi cercare? (premi q per terminare)");
    			String cittaCercata=utenteInput.nextLine();
    			boolean trovato=false;
    			if (!cittaCercata.equals("q")) {
    				for (int i=0; i<listVoli.size(); i++) {
    					Voli thisVolo=listVoli.get(i);
    					if (cittaCercata != null && thisVolo.getCittPart().equals(cittaCercata)) {
    						System.out.println(listVoli.get(i));
    						trovato=true;
    					}
    					if (cittaCercata != null && thisVolo.getCittDest().equals(cittaCercata)) {
    						System.out.println(listVoli.get(i));
    						trovato=true;
    					}
    				}
    				if (trovato=false)
    					System.out.println("Non ci sono voli per quella citta'!");
    			}
    			else
    				utenteAnnulla=true;
    		}
    		while (!utenteAnnulla);
    	}
    	public static void main (String[] args) {
    		Scanner scan=new Scanner(System.in);
    		System.out.println("Inserisci il nome del file in cui cercare: ");
    		String nomeFile=scan.nextLine();
    		boolean fileCaricato=GestVoli.caricaVoli(nomeFile);
    		if (fileCaricato==true)
    			GestVoli.startInterfaccia();
    		else
    			System.out.println("Non sono stati aggiunti i dati nel file!");
    	}
    }

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Si poteva fare meglio? E come?
    Inizierei da:
    1) rimuovere globalmente la parola "static" dal tuo codice (a parte per la main) e spostare quello che hai nella main, sistemandolo, nel costruttore GestVoli, o in un nuovo metodo (start, run) e nella main fare new GestVoli(), o new GestVoli().start().
    2) se fai prevalentemente ricerche avrei usato una hashtable non un arraylist.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Originariamente inviato da c0der
    Inizierei da:
    1) rimuovere globalmente la parola "static" dal tuo codice (a parte per la main)
    ciao, perché? cos'ha che non va l'uso di static in questi casi?


    e spostare quello che hai nella main, sistemandolo, nel costruttore GestVoli, o in un nuovo metodo (start, run) e nella main fare new GestVoli(), o new GestVoli().start().
    c'e' un motivo particolare?


    2) se fai prevalentemente ricerche avrei usato una hashtable non un arraylist.
    non sono ancora arrivata a fare le hashtable

    grazie!

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Originariamente inviato da Jamie04
    ciao, perché? cos'ha che non va l'uso di static in questi casi?
    Dimmi se sbaglio, tu hai messo tutto "static" semplicemente perché il compilatore ti diceva:
    "non-static method caricaVoli() cannot be referenced from a static context"
    e
    "non-static varoable listVoli cannot be referenced from a static context"
    non perché sapessi quando è giusto o meno usare "static."
    È così?

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Non proprio, ma la verità è che faccio ancora fatica a capire quando è meglio usarli e quando no, forse perché non ho ancora una buona padronanza del concetto - che francamente per me resta ancora un po' nebuloso.
    Poi mi sembrava comodo avere metodi che potevo utilizzare senza doverli per forza istanziare.

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Static per i metodi, come troveresti su qualunque manuale, serve solo quando il metodo non è legato alcun modo all'istanza.

    Un esempio è se fai una classe Utils con metodi per convertire da una unità ad un altra allora tutti i metodi li dichiari
    static, per poter usare Utils.fromCelsius(10). Qui creare una istanza di tipo Utils non ha senso.

    Per i campi significa che ha lo stesso valore in tutte le classi in cui lo usi, cosa pericolosissima se non sai cosa stai facendo.

    Ma nella tua classe no. GestVoli ha tutto l'interesse di essere una classe concepita senza variabili e metodi statici.
    Un domani che la usi in un progetto più grande magari avrai bisogno di creare più GestVoli, uno per i voli europei e uno per quelli extraeuropei, e se lo lasci così non è fattibile.

    Per quello che vedo dai tuoi esercizi tu non hai praticamente MAI bisogno di usare static, non lo usare mai. Avrà un senso magari in un programma che farai un giorno e allora farei bene ad usarlo, ora no.

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.