Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2011
    Messaggi
    17

    Array di stringhe con dimensione sconosciuta a priori.

    Salve a tutti.
    Avrai da fare un programma che gestisce un magazzino di Prodotti organizzati per Codice a barre, descrizione e prezzo.
    Questo programma deve mettere a disposizione alcune funzionalità quali la carica di un magazzino da un file testuale organizzato come un CSV.

    Questa è la parte di codice del carica file:

    codice:
    	public Magazzino leggiChar(String s){
    		FileReader file;
    		BufferedReader buff;
    		Magazzino mag = new Magazzino();
    		String temp ="";
    		//ArrayList<String> vect = new ArrayList<String>();
                    
                     try{
    			file = new FileReader(s);
    			buff = new BufferedReader(file);
    			String[] vect;	
    			while(temp!=null){
    				
    				Prodotto p = new Prodotto();
    				Float f; //Questi due wrapper mi servono per forza perché la split() restituisce un vettore di stringhe, quindi mi servono per fare il "cast".
    				Integer i;
    				temp = buff.readLine();
    				if(temp!=null){
    					
    					vect=temp.split(";");
    					p.setCodBarre(vect[0]);
    					p.setDescrizione(vect[1]);
    					f = Float.valueOf(vect[2]);
    					p.setPrezzo(f);
    					i = Integer.valueOf(vect[3]);
    					mag.inserimento(p, i);
    				}
    			}
    				
    			if(buff != null)
    				buff.close();
    		}catch(IOException e){}
    		
    		return mag;
    	}
    E questo è il file:

    codice:
    000;Latte;10.0;2; 
    003;Caffè;2.2;10; 
    001;Cioccolato;5;20;
    Quindi è organizzato del tipo CodBarre;descrizione;prezzo;scorte;

    Funziona tutto, tranne una cosa: la carica magazzino da un file già esistente sul computer. Praticamente mi rilancia l'eccezione ArrayIndexOutOfBoundException:1 .

    Ecco cosa mi esce dalla console di Eclipse:

    codice:
    1. Carica un magazzino da file di Char
    2. Carica un magazzino da un file di byte
    3. Crea un nuovo magazzino
    0. Esci dal programma
    1
    Inserisci il percorso del file da caricare
    E:/prove/magazzino.txt
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
    	at SerializzatoreMagazzino.leggiChar(SerializzatoreMagazzino.java:85)
    	at UIMagazzino.main(UIMagazzino.java:29)
    Ho pensato che il problema possa essere quel String[] vect; che mi alloca un vettore di una sola cella. Ho provato quindi a fare un ciclo while per contare quanti record ho, ma sarebbe terribilmente inefficiente. Qualcuno ha qualche altra soluzione?

    Grazie a tutti.

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    vect è dichiarato ma mai inizializzato.

    Ti manca un pezzo: vect = new String[dimensione];
    Se non sai a priori la dimensione meglio se usi un ArrayList: in automatico si espande se necessario.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2011
    Messaggi
    17
    La dimensione del mio magazzino non la conosco a priori. Quindi non saprei cosa metterci.

    EDIT:Ho provato ad usare ArrayList, ma il metodo split() di String mi restituisce un array di String, e quindi il compilatore mi da errore quando faccio vect=temp.split() dicendo che non può convertire da String ad ArrayList<String>

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Array di stringhe con dimensione sconosciuta a priori.

    Originariamente inviato da Apicio
    codice:
    Float f; //Questi due wrapper mi servono per forza perché la split() restituisce un vettore di stringhe, quindi mi servono per fare il "cast".
    Integer i;
    Il fatto che split fornisce un vettore di stringhe NON centra nulla con il fatto di dover usare un wrapper piuttosto che il primitivo.
    E tra l'altro da Java 5, wrapper e primitivi sono "interscambiabili" (al costo di un boxing/unboxing).
    Ma se setPrezzo riceve un float (primitivo) allora creare un Float è del tutto inutile.

    Originariamente inviato da Apicio
    Praticamente mi rilancia l'eccezione ArrayIndexOutOfBoundException:1 .

    Ho pensato che il problema possa essere quel String[] vect; che mi alloca un vettore di una sola cella.
    Scommetto che nel file hai o una riga "vuota" oppure una riga malformata (non in quel formato che ti aspetti). E quindi split fornisce meno "pezzi".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2011
    Messaggi
    17
    Grazie! Avevi ragione sulla riga vuota!! Proverò a modificare il codice per fargli capire che se la riga è vuota deve fermarsi.

    Peer quanto riguarda i wrapper: se io vado a fare p.setPrezzo(vect[2]); il compilatore mi da errore perché dice che non può convertire da String a float (setPrezzo riceve un float), per questo ho dovuto ricorrere ai wrapper.

    Da un esempio visto sul tuo sito ho capito che potrei ovviare a questo inconventiente con un arraylist, o sbaglio?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Apicio
    Peer quanto riguarda i wrapper: se io vado a fare p.setPrezzo(vect[2]); il compilatore mi da errore perché dice che non può convertire da String a float
    Questo è ovvio, da solo non fa queste conversioni.

    Originariamente inviato da Apicio
    (setPrezzo riceve un float), per questo ho dovuto ricorrere ai wrapper.
    No.

    Float.parseFloat(String)

    restituisce il float primitivo. Se hai usato il valueOf che fornisce un Float (wrapper) è corretto (da Java 5) ma inutile perché comunque nella invocazione a setPrezzo viene unboxato e passato il float primitivo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2011
    Messaggi
    17
    Ho capito dove ho sbagliato.
    Praticamente avrei potuto scrivere direttamente p.setPrezzo(Float.valueOf(vect[2])); ?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Apicio
    Ho capito dove ho sbagliato.
    Praticamente avrei potuto scrivere direttamente p.setPrezzo(Float.valueOf(vect[2])); ?
    Tecnicamente certo. Ma è perché da Java 5 si ha il boxing/unboxing automatico.
    valueOf ritorna un java.lang.Float, che il compilatore "unboxa" a float. Ma sarebbe superfluo, un passaggio inutile.

    Le classi wrapper (perlomeno per i tipi numerici) hanno due tipi di metodi statici per la conversione da un String: i parseXyz e i valueOf. Il primo ritorna il primitivo, il secondo il wrapper. In java.lang.Float ci sono:

    public static float parseFloat(String s)
    public static Float valueOf(String s)

    Vedi la differenza?

    Quindi:
    p.setPrezzo(Float.parseFloat(vect[2]));

    parseFloat ritorna un float primitivo che viene passato pari-pari al setPrezzo che riceve il float, senza passaggi intermedi/nascosti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.