Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    6

    da file ad arraylist

    Ciao a tutti!
    Ho un problema riguardo una lettura da un file.txt e alla copia in un arraylist, che successivamente dovrò andare a riordinare..
    Questo è il codice che ho provato a scrivere:

    codice:
    package negozio.data;
    
    import java.io.FileReader;
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.util.Date;
    import java.util.StringTokenizer;
    import java.util.ArrayList;
     
    /**
     * Classe Magazzino che contiene i dati per mezzo di un arraylist
     */
    public class Magazzino 
    {
      public static void main( String [] args )
      {
       // dichiaro ArrayList perchè contenga i prodotti
       ArrayList<Prodotto> listaProdotto = new ArrayList<Prodotto>( );
     
       try
       {
         FileReader fr = new FileReader( "store.txt" );
         BufferedReader br = new BufferedReader( fr );
     
         // dichiaro la variabile String
         String stringRead = br.readLine( );
     
         while( stringRead != null ) 
         {
           // uso lo StringTokenizer per scorrere il file suddiviso dai pipe
           StringTokenizer st = new StringTokenizer( stringRead, "|" );
           String id = st.nextToken( );
           String descrizione = st.nextToken( );
           
           try
           {
             int costo = Integer.parseInt( st.nextToken( ) );
             int quantita = Integer.parseInt( st.nextToken( ) );
             float temperatura = Float.parseFloat( st.nextToken( ) );
             date scadenza = Date.parseDate(st.nextToken());
     
             Prodotto frTemp = new Prodotto(id, descrizione, costo, quantita, temperatura,scadenza);
     
             // aggiungo il prodotto alla lista prodotti
             listaProdotto.add( frTemp );
           }
     
           catch( NumberFormatException nfe )
           {
             System.out.println( "Errore in prodotti: " + stringRead + "; record" );
           }
     
           // legge la linea 
           stringRead = br.readLine( );
         }
     
         // chiude il flusso con "store.txt"
         br.close( );
       }
     
       catch( FileNotFoundException fnfe )
       {
         System.out.println( "ERRORE:File store.txt non trovato" );
       }
     
       catch( IOException ioe )
       {
         ioe.printStackTrace( );
       }
     
       // stampa i prodotti letti 
       for ( Prodotto elementi : listaProdotto )
           System.out.println( elementi );
     }
    }
    Il problema riguarda la scadenza che è di tipo date e mi genera un errore anche se importo: java.util.Date;
    Inoltre volevo sapere come mai non viene letto il file in questo modo:
    FileReader fr = new FileReader( "store.txt" );
    ma solo sostituendo al posto del nome un path assoluto (C:/store.txt) che preferirei evitare.
    Grazie a tutti anticipatamente.

  2. #2
    Utente di HTML.it L'avatar di nether
    Registrato dal
    Dec 2006
    Messaggi
    376
    in che formato e' la stringa della data della scadenza? Probabilmente dovrai usare un oggetto della classe SimpleDateFormat per parsarla correttamente (il cui metodo parse() ti restituisce un oggetto Date).

    Per la questione del percorso relativo al file: credo che tu debba passare al FileReader il percorso completo altrimenti non saprebbe dove cercare il file. Cio' non significa necessariamente che devi scrivere "a mano" l'intero percorso assoluto all'interno della tua classe.
    Se dentro la tua classe provi a fare
    codice:
    System.out.println(System.getProperty("user.dir"));
    cosa ti stampa?

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    6
    La stringa della data di scadenza è gg/mm/aaaa
    Il file txt ho provato ad inserirlo all'interno dello stesso package quindi pensavo poi fosse in grado di andarselo a prendere da solo.

    System.out.println(System.getProperty("user.dir")) ;

    per quanto riguarda questo non so dirti cosa mi dia in output, poichè in fase di compilazione ho 2 errori uno legato alla data, che per il momento posso anche commentare il codice relativo..
    l'altro è presente nel costruttore
    Prodotto frTemp = new Prodotto(id, descrizione, costo, quantita, temperatura);
    "cannot find simbol" non capisco perchè

  4. #4
    Utente di HTML.it L'avatar di nether
    Registrato dal
    Dec 2006
    Messaggi
    376
    La stringa della data di scadenza è gg/mm/aaaa
    codice:
    String scadenzaString = st.nextToken();
    SimpleDateFormat sdt = new SimpleDateFormat("dd/MM/yyyy");
    Date scadenza = sdt.parse(scadenzaString, new ParsePosition(0));
    Prodotto frTemp = new Prodotto(id, descrizione, costo, quantita, temperatura);
    "cannot find simbol" non capisco perchè
    l'errore su cosa te lo da'? su "Prodotto"? probabilmente non hai importato la classe Prodotto?

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    6
    Ok l'errore della data così è risolto!

    quello del costruttore è:
    symbol : constructor Prodotto(java.lang.String,java.lang.String,int,int ,float,java.util.Date)
    location: class negozio.data.Prodotto
    Prodotto frTemp = new Prodotto(id, descrizione, costo, quantita, temperatura, scadenza);
    1 error

    Però prodotto viene compilato correttamente... ho aggiunto nella classe magazzino
    import negozio.data.Prodotto;
    che mi ero dimenticato... ma anche così permane lo stesso errore.

  6. #6
    Utente di HTML.it L'avatar di nether
    Registrato dal
    Dec 2006
    Messaggi
    376
    symbol : constructor Prodotto(java.lang.String,java.lang.String,int,int ,float,java.util.Date)
    sembra che nella tua classe prodotto non ci sia un costruttore che accetta quei parametri in quell'ordine. In Prodotto dovresti avere una cosa tipo
    codice:
    public Prodotto(String id, String descrizione, int costo, int quantita, float temperatura, Date scadenza) {
        this.id = id;
        this.descrizione = descrizione;
        this.costo = costo;
        this.quantita = quantita;
        this.temperatura = temperatura;
        this.scadenza = scadenza;
    }
    naturalmente anche in Prodotto devi importare la classe Date, ma credo che tu l'abbia fatto altrimenti ti darebbe errori anche nella compilazione di Prodotto

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    6
    Intanto volevo ringraziarti per l'aiuto datomi fino ad adesso.
    La parte di codice da te suggerita l'avevo già scritta così anche come l'inserimento della classe Date, andando però a cambiare l'ordine dei parmetri nel modo corretto, sono spariti anche gli errori! non avevo dato molto peso alla cosa...

    La stampa avviene in modo corretto...o quasi.. utilizza la gestione delle eccezioni nel codice per stampare la lista di prodotti:
    System.out.println( "Errore in prodotti: " + stringRead + "; record" );

    e non il mio ciclo di stampa
    // stampa i prodotti letti
    for ( Prodotto elementi : listaProdotto )
    System.out.println( elementi );

    Questo può influire sulla costruzione del mio arraylist o viene creato cmq?
    Visto che devo andarlo a riordinare aprofitto per chiederti un'altra cosa.. mi conviene utilizzare comparator o comparable per es ordinarli tutti per n di id.

  8. #8
    Utente di HTML.it L'avatar di nether
    Registrato dal
    Dec 2006
    Messaggi
    376
    adesso come adesso il tuo arraylist viene riempito fintanto che non si verifica un'eccezione. Nel momento in cui si verifica, nel tuo caso, una NumberFormatException, l'esecuzione smette istantaneamente di fare cio' che e' contenuto nel "try" (quindi di riempire l'arraylist con i prodotti) e passa ad eseguire cio' che c'e' nel "catch" (quindi ti stampa la riga relativa agli errori).
    Ragione per la quale, se l'eccezione avviene "al primo giro", ossia quando consideri i dati relativi al primo prodotto, il tuo arraylist te lo trovi vuoto nel momento in cui cerchi di stamparne il contenuto.

    Visto che devo andarlo a riordinare aprofitto per chiederti un'altra cosa.. mi conviene utilizzare comparator o comparable per es ordinarli tutti per n di id.
    si, io ti consiglio di scrivere una classe che implementa l'interfaccia Comparator e usarla per definire il tuo criterio di ordinamento. Una cosa tipo:
    codice:
    public class ProdottoByIdAscComparator implements Comparator {
    	
    	public int compare(Object o1, Object o2) {
    		Prodotto p1 = (Prodotto) o1;
    		Prodotto p2 = (Prodotto) o2;
    		return (p1 == p2 ? 0 : (p1 == null ? -1 : (p2 == null ? 1 : p1.getId().compareTo(p2.getId()))));
    	}
    }
    con tutti gli import del caso, che nn ho riportato

    Poi, quando vorrai ordinare il tuo arraylist di prodotti, usa:
    codice:
    Collections.sort(listaProdotto, new ProdottoByIdAscComparator());
    anche qui, non dimenticare gli import

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    6
    Originariamente inviato da nether
    adesso come adesso il tuo arraylist viene riempito fintanto che non si verifica un'eccezione. Nel momento in cui si verifica, nel tuo caso, una NumberFormatException, l'esecuzione smette istantaneamente di fare cio' che e' contenuto nel "try" (quindi di riempire l'arraylist con i prodotti) e passa ad eseguire cio' che c'e' nel "catch" (quindi ti stampa la riga relativa agli errori).
    Ragione per la quale, se l'eccezione avviene "al primo giro", ossia quando consideri i dati relativi al primo prodotto, il tuo arraylist te lo trovi vuoto nel momento in cui cerchi di stamparne il contenuto.
    capito grazie

    ho provato a fare il riordino questo pomeriggio... facendo solo un pò di danni
    saresti così gentile da dare un occhio anche a quest'ultima cosa..

    ho fatto l'ordinamento per id ma mi scrive ancora 2 warning compilando magazzino, gli altri errori li ho già risolti con inserendo alcuni import mancanti..

    1)found : negozio.data.ProdottoByIdComparator
    required: java.util.Comparator<? super negozio.data.Prodotto>
    Collections.sort(listaProdotto, new ProdottoByIdComparator());

    2)Collections.sort(listaProdotto, new ProdottoByIdComparator());

    2 warnings
    ----------------------------------------------------------------------------------------
    Ho provato anche a scrivere una parte di codice per fare un altro tipo di ordinamento
    (es per scadenza e anche per quantita)
    codice:
    import java.util.Comparator;
    
    public class ProdottoByScadenzaComparator {
        
         public ProdottoByScadenzaComparator() {
        }
          public int compare(Object o1, Object o2) {
    		Prodotto p1 = (Prodotto) o1;
    		Prodotto p2 = (Prodotto) o2;
    		return (p1 == p2 ? 0 : (p1 == null ? -1 : (p2 == null ? 1 : p1.getScadenza().compareTo(p2.getScadenza()))));
    	}
    }
    codice:
    import java.util.Comparator;
    public class ProdottoByQuantitaComparator {
        
        /** Creates a new instance of ProdottoByQuantitaComparator */
        public ProdottoByQuantitaComparator() {
        }
          public int compare(Object o1, Object o2) {
    		Prodotto p1 = (Prodotto) o1;
    		Prodotto p2 = (Prodotto) o2;
    		return (p1 == p2 ? 0 : (p1 == null ? -1 : (p2 == null ? 1 : p1.getQuantita().compareTo(p2.getQuantita()))));
    	}
    }
    il primo si compila correttamente il secondo invece mi dice:
    int cannot be dereferenced.

    Quando vado poi a richiamare entrambe in magazzino con tt gli import
    es.
    Collections.sort(listaProdotto, new ProdottoByScadenzaComparator());
    Collections.sort(listaProdotto, new ProdottoByQuantitaComparator());
    mi genera un altro errore:
    symbol : method sort(java.util.ArrayList<negozio.data.Prodotto>,ne gozio.data.ProdottoByScadenzaComparator)
    location: class java.util.Collections
    Collections.sort(listaProdotto, new ProdottoByScadenzaComparator());

    Spero di aver esposto in modo chiaro questi errori e di non averti disturbato troppo per oggi...

  10. #10
    Utente di HTML.it L'avatar di nether
    Registrato dal
    Dec 2006
    Messaggi
    376
    1)found : negozio.data.ProdottoByIdComparator
    required: java.util.Comparator<? super negozio.data.Prodotto>
    Collections.sort(listaProdotto, new ProdottoByIdComparator());

    2)Collections.sort(listaProdotto, new ProdottoByIdComparator());
    prova a vedere se spariscono i warning (il secondo credo che sia collegato al primo) usando questa definizione x la classe del comparator (importa anche la classe Prodotto):
    codice:
    public class ProdottoByIdComparator<T extends Prodotto> implements Comparator {
    se non sparisce, dimmi se ti da' un warning differente.


    il primo si compila correttamente il secondo invece mi dice:
    si perche' su un int, non essendo un oggetto ma un tipo base, non puoi chiamare il metodo "compareTo()".
    per risolvere in fretta usa il suo wrapper:
    codice:
    return (p1 == p2 ? 0 : (p1 == null ? -1 : (p2 == null ? 1 : new Integer(p1.getQuantita()).compareTo(new Integer(p2.getQuantita())))));

    mi genera un altro errore:
    symbol : method sort(java.util.ArrayList<negozio.data.Prodotto>,ne gozio.data.ProdottoByScadenzaComparator)
    location: class java.util.Collections
    Collections.sort(listaProdotto, new ProdottoByScadenzaComparator());
    ti sei dimenticato di far implementare l'interfaccia Comparator alle classi che hai scritto tu

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.