Aiuto esercizio

di il
20 risposte

Aiuto esercizio

Ciao a tutti, vi contatto perchè ho bisogno di aiuto riguardo ad un piccolo problemino in java.
è da poco che studio java e mi sono imbattuto in un esercizio che riguarda la scrittura in un file di testo. il problema richiede la lettura del file tramite inserimento di una parola da tastiera e mi dovrebbe uscire ad esempio solo gli articoli della marca inserita. vi allego il problema in modo da intenderci meglio.
comunque sono riuscito a fare la parte in cui stampo l'archivio, e anche i primi due punti ma mi sono bloccato al terzo e al quarto punto. ho costruito due classi una che gestisce il tutto con il metodo main e l'altra dove ho scritto tutti i metodi per fare i primi due punti, e poi ho scritto le auto in un file di testo. vi prego di aiutarmi a capire come proseguire.
vi ringrazio in anticipo per le vostre risposte!!

20 Risposte

  • Re: Aiuto esercizio

    isanet ha scritto:


    il gestore della concessionaria d'auto memorizza le informazioni sulle auto disponibili all'interno di un file di testo, in modo che ciascun dato occupi una sola linea.

    Fiat
    Panda
    Rossa
    900
    9000.00
    Lancia
    156
    Grigia
    1400
    3000.00
    ……..
    Sì, un dato occupa una sola linea ma ... un "record" di informazione (ovvero una auto) è su più righe (5 da quanto vedo).

    Comunque:
    - hai realizzato una classe es. Auto che "modella" quelle informazioni?
    - hai realizzato una classe es. LettoreFileAuto che si occupa SOLO della lettura/parsing del file, fornendo oggetti Auto (uno per volta o una lista o entrambe le opzioni)? Hai considerato gli scenari di errore nella lettura in modo appropriato? (es. l'ultimo record ha solo 2 dati ... cosa si vuole fare?)
    - visto che devi poter fare operazioni particolari (ricerche e filtri) su un "insieme" di auto, hai realizzato, preferibilmente, una classe es. InsiemeAuto che incapsula (come minimo) un List<Auto> e offre i metodi per gestire l'insieme ed effettuare le "query" di ricerca volute?

    Perché questo sarebbe perlomeno il modo "buono" di affrontare la questione.
  • Re: Aiuto esercizio

    .Ti scrivo i due file .java che ho scritto:
    
    Gestore.java
    
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class Gestore {
    
    public static void main (String []args) throws IOException
    {
    // richiamo tutto quello che fa parte della classe TipoAuto
    TipoAuto a = new TipoAuto(); // permette di stampare l'archivio
    
    a.CostoMax();
    }
    }
    ------------------------------------------------------------------------------------------------------------------
    TpoAuto.java
    
    import java.io.*;
    import java.util.*;
    
    
    public class TipoAuto {
    // costruisco uno Scanner che mi permette di leggere in un file di testo tramite FileReader.
    //uso un ciclo while per leggere tutte le righe e le stampo a video tramite la classe Gestore.
    
    //	creo un ArrayList contenete tutte le informazioni del file Auto.txt
    ArrayList <String> file = new ArrayList <String>();
    
    {
    try { // il costruttore FileReader lancia IOException, da gestire!!
    FileReader reader = new FileReader("src/Auto.txt");
    
    Scanner in = new Scanner(reader);
    System.out.println("Archivio: \n ");
    
    while(in.hasNextLine())
    { 
    String line = in.nextLine(); //... leggo le stringhe!
    System.out.println(in.next()); 
    } 
    reader.close();
    }
    catch (IOException e) {
    System.out.println("c'è stata un'eccezione");
    e.printStackTrace();
    }
    
    }
    
    public TipoAuto ( ) throws IOException { 
    
    FileInputStream fis = new FileInputStream ( "src/Auto.txt" ) ; 
    Scanner in = new Scanner(System.in);
    //Costruisco BufferedReader da InputStreamReader 
    BufferedReader br = new BufferedReader ( new InputStreamReader ( fis ) ) ; 
    
    //	utilizzo un ciclo while per memorizzare i file nell'arraylist
    String contenutoFile = br.readLine();
    while (contenutoFile != null) {
    file.add(contenutoFile);
    contenutoFile = br.readLine();
    }
    
    boolean finito = false;
    
    while(!finito){
    
    //	tramite lo Scanner inserisco la marca e la salvo in r
    System.out.println("\nInserire marca (con lettera maiuscola): ");
    String r = in.next();
    
    //	questo ciclo mi permette di stampare le auto di una determinata marca
    for(int i = 1; i<file.size(); i++){
    if(file.get(i).equals(r)){
    System.out.println("\nAuto disponibili per la marca: " + r );
    System.out.println("Marca: "+file.get(i));
    System.out.println("Modello: "+file.get(i+1));
    System.out.println("Colore: "+file.get(i+2));
    System.out.println("Cilindrata: "+file.get(i+3));
    System.out.println("Prezzo: "+file.get(i+4));	
    }
    
    
    }
    
    System.out.println("\nRieseguire la ricerca? ***1=si 0=no***");
    int scelta=in.nextInt();
    //se la scelta è uguale a 0 allora esco dal ciclo
    if(scelta == 0){
    finito =true;
    System.out.println("\n++++++++Seconda parte++++++++ \n");
    } 
    }
    
    //	con questo ciclo stampo auto di una determinata marca e modello
    
    while(finito){
    System.out.println("\nInserire Marca (con lettera maiuscola): ");
    String l = in.next();
    System.out.println("\nInserire Modello (con lettera maiuscola): ");
    String a = in.next();
    
    for(int i = 1; i<file.size(); i++){
    
    if(file.get(i).equals(l) && file.get(i+1).equals(a)){
    System.out.println("\nMarca e Modello inserito: " + l+" " + a );
    System.out.println("Marca: "+file.get(i));
    System.out.println("Modello: "+file.get(i+1));
    System.out.println("Colore: "+file.get(i+2));
    System.out.println("Cilindrata: "+file.get(i+3));
    System.out.println("Prezzo: "+file.get(i+4));	
    }
    
    }
    
    System.out.println("\nRieseguire la ricerca? ***1=si 0=no***");
    int scelta=in.nextInt();
    //se la scelta è uguale a 0 allora esco dal ciclo
    if(scelta == 0){
    finito =false;
    System.out.println("\n++++++++Terza parte++++++++ \n");
    } 
    
    }
    
    br. close ( ) ; 
    }	
    
    }
    
    -------------------------------------------------------------------------------------------------------
    Auto.txt
    
    Fiat
    Panda
    Rossa
    900
    9000.00
    Lancia
    156
    Grigia
    1400
    23000.00
    Audi
    A5
    Nera
    2000
    20000.00
    Fiat
    500
    Nera
    1400
    15000.00
     
      
  • Re: Aiuto esercizio

    Il codice va postato nei tag CODE, altrimenti è illeggibile.
  • Re: Aiuto esercizio

    @isanet: mi spiace dirlo ma il tuo codice è parecchio ... molto lontano dallo scenario che ho ipotizzato e suggerito io. Il tuo codice ha diversi problemi, mischia diverse cose insieme e soprattutto utilizza una lista di String che sono le righe "crude", quindi qualcosa di molto de-strutturato e quindi ben poco object-oriented.
  • Re: Aiuto esercizio

    andbin ha scritto:


    @isanet: mi spiace dirlo ma il tuo codice è parecchio ... molto lontano dallo scenario che ho ipotizzato e suggerito io. Il tuo codice ha diversi problemi, mischia diverse cose insieme e soprattutto utilizza una lista di String che sono le righe "crude", quindi qualcosa di molto de-strutturato e quindi ben poco object-oriented.
    grazie per la risposta purtroppo sono molto poco pratico nel linguaggio java sto cercando di esercitarmi facendo esercizi del genere (questo è il primo)...so che è sbagliato come è stato implementato però comunque funzionano i primi due passi se casomai puoi darmi una mano a fare gli altri due giusto così per capire come farli!!
  • Re: Aiuto esercizio

    isanet ha scritto:


    se casomai puoi darmi una mano a fare gli altri due giusto così per capire come farli!!
    Se i tuoi dubbi sono su:

    3) l'auto con il costo maggiore, supponendo che le abbiano costi diversi
    4) le auto il cui prezzo non supera un certo valore

    Allora la prima cosa da affrontare è il fatto che hai solo tutte stringhe che sono le righe crude del file. Ogni riga che ha il prezzo la devi convertire in double e visto che risulta essere in formato inglese senza raggruppamenti delle migliaia (es. 1234.56) allora puoi usare Double.parseDouble(String).

    Una volta che hai dei double in mano, i 3) e 4) richiedono solo un po' di logica. Il 4) è banale, per ciascuna auto se prezzo < X, la stampi.
    Il 3) necessita di qualche logica in più. Quale è la auto con il costo maggiore lo puoi sapere in assoluto solo dopo aver esaminato tutte le auto. Quindi come minimo devi tenerti l'indice e prezzo max "attuale" e man mano che scorri le auto, se trovi un prezzo più alto aggiorni questi due dati.


    Sono certo che comprendi che gestire una lista di righe crude è scomodo, brutto e per niente object-oriented. Per questo esercizio risolvi pure così come riesci e con le indicazioni date. Ma per altri esercizi cerca poi di orientarti diversamente.
  • Re: Aiuto esercizio

    Proviamo a ragionare.
    Adesso fai finta che tu non hai il file. Il file con le righe non esiste.

    La traccia ti dice:
    un'auto è contraddistinta da varie caratteristiche come: marca, modello, colore, cilindrata, prezzo.
    Quindi sembrerebbe che ci dobbiamo scrivere una classe Auto basata sulle caratteristiche elencate nella traccia.
    La classe è un'astrazione dell'auto, a te non importa dove e/o come le caratteristiche siano rappresentate nel "mondo esterno". Per questo ti dico di dimenticare che hai il file, in questo momento non serve.

    Quindi la classe Auto come è fatta?
    Suppongo dovrà avere i seguenti attributi:
    private String marca, modello, colore;
    private double cilindrata, prezzo;
    Dove assegno i valori degli attributi? Nel costruttore.
    Come è fatto il costruttore? Semplice:
    public Auto(String marca, String modello, String colore, double cilindrata, double prezzo) {
        //controllo che i valori dei parametri 
        //siano consistenti (es prezzo e cilindrata > 0, ecc)
        //assegno i valori agli attributi.
    }
    
    Cosa manca ancora alla classe?
    Mancano i metodi getters:
    public String getMarca() {return marca;}
    //uno per ogni attributo
    Setters ce ne stanno? Solo per gli attributi che posso cambiare.
    un metodo setMarca() non avrebbe senso (non credo che una fiat possa diventare un ford ),
    un metodo setPrezzo() o setColore() potrebbero aver senso.
    Comunque, manteniamo le cose semplici e non mettiamo nessun metodo setters. In questo modo gli oggetti Auto sono immutabili.

    Sembrerebbe tutto ok.
    In realtà manca una cosa molto importante. Il metodo equals.
    Quand'è che due auto sono uguali (a parte il fatto in cui sono in aliasing) ?
    Due auto sono uguali quando hanno la stessa marca, lo stesso modello, lo stesso colore, la stessa cilindrata e lo stesso prezzo.
    Ed anche il metodo equals() è fatto.

    Dato che ci sei scriviti il toString(), è banale.

    Scrivi quindi la classe Auto è postala. Poi cerchiamo di andare avanti.
  • Re: Aiuto esercizio

    xneo ha scritto:


    Scrivi quindi la classe Auto è postala. Poi cerchiamo di andare avanti.
    Va bene così?? ho scritto tutti i get and set giusto così per averli tutti anche se non li dovrò usare.
    
    public class Auto {
    	
    	private String marca;
            private String modello;
            private String colore;
    	private double cilindrata;
            private double prezzo;
    	
    	public Auto(String marca, String modello, String colore, double cilindrata, double prezzo){
    		
    		this.marca = marca;
    		this.modello = modello;
    		this.colore = colore;
    		this.cilindrata = cilindrata;
    		this.prezzo = prezzo;
    		
    	}
    
    	public String getMarca() {
    		return marca;
    	}
    
    	
    	public String getModello() {
    		return modello;
    	}
    
    
    	public String getColore() {
    		return colore;
    	}
    
    	public void setColore(String colore) {
    		this.colore = colore;
    	}
    
    	public double getCilindrata() {
    		if(cilindrata < 0)
    		{
    			System.out.println("Cilindrata non valida: " + cilindrata);
    		}
    			return cilindrata;	
    	}
    
    
    	public double getPrezzo() {
    		if(prezzo < 0)
    		{
    			System.out.println("Prezzo non valido: " + prezzo);
    		}
    			return prezzo;	
    	}
    
    	public void setPrezzo(double prezzo) {
    		this.prezzo = prezzo;
    	}
    
    	
    	 public String toString(){
    		  return "Marca "+marca+" Modello "+modello+" Colore "+colore+" Cilindrata "+cilindrata+" Prezzo "+prezzo;
    	  }
    }
    
  • Re: Aiuto esercizio

    isanet ha scritto:


    Va bene così??
    Sì va bene, tecnicamente è assolutamente corretta.
    A livello di stile ti direi solo di dichiarare i campi uno per riga

    private String marca;
    private String modello;
    ......

    Ti può sembrare una pignoleria ma è quello che si fa di norma. Vale in generale per tutte le variabili.

    isanet ha scritto:


    ho scritto tutti i get and set giusto così per averli tutti anche se non li dovrò usare.
    Li userai ..... li devi usare.
    Sicuramente i getter. I setter probabilmente no, visto che hai già il costruttore appropriato.


    Ora ti servirebbe una classe es. LettoreFileAuto e ti dò anche un abbozzo:
    public class LettoreFileAuto {
        private BufferedReader bufReader;
        
        // puoi anche usare java.io.File per il nome
        public LettoreFileAuto(String nomeFile) throws FileNotFoundException {
            // .... arriva a creare il BufferedReader
        }
        
        // metti un metodo close() per chiudere il BufferedReader
    
        public Auto leggiAuto() throws IOException {
            // ..... legge le 5 righe del "record" auto, converte ciò che è
            // necessario e crea e restituisce un oggetto Auto.
            //
            // Altrimenti restituisce null se fine dei record.
        }
    }
  • Re: Aiuto esercizio

    A livello di stile ti direi solo di dichiarare i campi uno per riga
    Le variabili le avevo scritte in quel modo per risparmiarmi di scrivere ogni volta
    private String
    .

    Nel costruttore è meglio se controlli che il prezzo o la cilindrata siano maggiori di zero.
    Se io scrivo:
    Auto a=new Auto("Fiat", "Panda", "Rosso", 900, -5000)
    Non riscontro nessun errore ma capisci che vuol dire???
    La macchina costa -5000€.

    Per quanto riguarda i setters.
    setMarca() e setModello() non hanno senso, come ti avevo scritto.
    Ora ti servirebbe una classe es. LettoreFileAuto
    Secondo me, ancora non servirebbe.
    A questo punto può svolgere il resto della traccia scrivendosi il GestoreConcessionaria.

    EDIT:
    Non hai scritto il metodo più importante: equals().
    Senza equals() l'esercizio non lo puoi fare
  • Re: Aiuto esercizio

    xneo ha scritto:


    Secondo me, ancora non servirebbe.
    A questo punto può svolgere il resto della traccia scrivendosi il GestoreConcessionaria.
    E quindi GestoreConcessionaria quali responsabilità avrebbe?
    - gestire materialmente l'insieme (la lista) di Auto
    - offrire i metodi per effettuare le "query" di ricerca.
    - gestire il caricamento dei dati da file.

    Così?

    Sono già 3 le responsabilità. Le prime due sono correlate, in un certo senso, sono cose di "logica" applicativa. La terza no, è tutta un'altra cosa, riguarda in generale il I/O.
    E se conosci qualcosina di OOP ......
  • Re: Aiuto esercizio

    andbin ha scritto:


    Ora ti servirebbe una classe es. LettoreFileAuto e ti dò anche un abbozzo:
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.Scanner;
    
    public class LettoreFileAuto 
    {
    	 private BufferedReader bufReader;
    	 
    	 public LettoreFileAuto(String nomeFile) throws FileNotFoundException, IOException
    	 {
    		// .... arriva a creare il BufferedReader
    		 bufReader = new BufferedReader(new FileReader("src/Auto.txt"));
    		 bufReader.close();
         }
    	 
    	 public Auto leggiAuto() throws IOException 
    	 {
    		
    	        // ..... legge le 5 righe del "record" auto, converte ciò che è
    	        // necessario e crea e restituisce un oggetto Auto.
    	        //
    	        // Altrimenti restituisce null se fine dei record.
    	   }
    	
     }
    
    come devo scrivere questa parte??
     public Auto leggiAuto() throws IOException 
    	 {
    		
    	        // ..... legge le 5 righe del "record" auto, converte ciò che è
    	        // necessario e crea e restituisce un oggetto Auto.
    	        //
    	        // Altrimenti restituisce null se fine dei record.
    	   }
    	

    xneo ha scritto:


    Le variabili le avevo scritte in quel modo per risparmiarmi di scrivere ogni volta
    private String
    .

    Nel costruttore è meglio se controlli che il prezzo o la cilindrata siano maggiori di zero.
    Se io scrivo:
    Auto a=new Auto("Fiat", "Panda", "Rosso", 900, -5000)
    Non riscontro nessun errore ma capisci che vuol dire???
    La macchina costa -5000€.
    ho modificato la risposta di prima!!

    xneo ha scritto:


    Secondo me, ancora non servirebbe.
    A questo punto può svolgere il resto della traccia scrivendosi il GestoreConcessionaria.

    EDIT:
    Non hai scritto il metodo più importante: equals().
    Senza equals() l'esercizio non lo puoi fare
    cosa dovrebbe fare GestoreConcessionaria??
    come lo devo scrivere il metodo equals()??
  • Re: Aiuto esercizio

    E quindi GestoreConcessionaria quali responsabilità avrebbe?
    - gestire materialmente l'insieme (la lista) di Auto
    - offrire i metodi per effettuare le "query" di ricerca.
    - gestire il caricamento dei dati da file.
    GestoreAuto è un oggetto che incapsula una lista di Auto e offre i metodi:
    List<Auto> getAuto(Auto a)
    List<Auto> cercaAutoPerMarca(String marca)
    List<Auto> cercaAutoPerMarcaEModello(String marca, String modello)
    Auto getAutoCostoMax()
    List<Auto> autoCostoMinore(double prezzo)
    Il costruttore di GestoreConcessionaria sarà:
    public GestoreConcessionaria(List<Auto> automobili) {
        this.automobili=automobili;
    }
    Come ottengo la List<Auto>?
    In questo momento non mi interessa, la ottengo solo a runtime.
    Implementando questi metodi l'esercizio è risolto al 99%.

    Il caricamento dei dati dal file lo fa un'altra classe, ad esempio Lettore.
    Adesso però facciò in modo che Lettore mi restituisca una List<Auto>.

    Inoltre come vedi GestoreConcessionaria non sa nulla di come è fatto il file, quindi volendo il file potrebbe anche essere fatto così:
    MARCA1, MODELLO1, COLORE1, CILINDRATA1, PREZZO1
    MARCA2, MODELLO2, COLORE2, CILINDRATA2, PREZZO2
    Al GestoreConcessionaria non interessa.

    Fidati che qualcosina di OOP la capisco...
  • Re: Aiuto esercizio

    Nel costruttore di Auto è ancora possibile inserire una cilindrata negativa o un prezzo negativo e farla franca.
    Poi, te lo chiedo per favore, togli setMarca() e setModello() e anche setCilindrata()
    cosa dovrebbe fare GestoreConcessionaria??
    Già risposto
    come lo devo scrivere il metodo equals()??
    Come lo scriveresti???
Devi accedere o registrarti per scrivere nel forum
20 risposte