Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Problema StringTokenizer e ArrayList

    Buongiorno. Sto facendo un esercizio in cui devo creare un programma per la gestione di un registro studenti. So che la StringTokenizer è deprecata, ma me lo richiede l'esercizio quindi la uso lo stesso.

    Ho creato parte una classe Studente che si occupa di sovrascrivere il metodo toString e basta per ora. Ogni Studente è identificato da nome cognome e matricola.

    Il programma deve leggere dal file archivio.txt nome, cognome e matricola degli studenti e salvarli in un oggetto di tipo studente, che a sua volta io ho deciso di salvare su un ArrayList. SUccessivamente devo stampare il contenuto dell'ArrayList normalmente e al contrario. La parte in cui trasformo ogni singola linea in un token sembra funzionare, ma in output io ottengo la seguente cosa:


    Sto iniziando a leggere il file ./archivio.txt
    Alfonso Maiorino 743191
    Laura Frisone 123455
    Silvio Preti 387121
    Stefano Manduzio 217389
    Ho finito di leggere dal file ./archivio.txt e l'ho chiuso!
    [{Nome: Alfonso; Cognome: Maiorino; Matricola: 743191}, {Nome: Alfonso; Cognome: Maiorino; Matricola: 743191}, {Nome: Alfonso; Cognome: Maiorino; Matricola: 743191}, {Nome: Alfonso; Cognome: Maiorino; Matricola: 743191}]
    [{Nome: Alfonso; Cognome: Maiorino; Matricola: 743191}, {Nome: Alfonso; Cognome: Maiorino; Matricola: 743191}, {Nome: Alfonso; Cognome: Maiorino; Matricola: 743191;}, {Nome: Alfonso; Cognome: Maiorino; Matricola: 743191;}

    L'ArrayList sopra è quello stampato normalmente, quello sotto quello stampato al contrario. Non capisco perchè, pur funzionandomi la tokenizzazione e pur funzionandomi la lettura delle singole linee, quando devo aggiungere gli elementi sull'ArrayList mi mette sempre lo stesso elemento ma quattro volte.

    Riporto sotto il codice della classe GestioneRegistro.

    codice:
    public class GestioneRegistro {
    
    
        private String nome = new String();
        private String cognome = new String();
        private String matricola = new String();
        Studente studente = new Studente(nome, cognome, matricola);
    
    
        public ArrayList<Studente> letturaDati(String nomeFileDaLeggere) {
            BufferedReader reader = null;
            ArrayList<Studente> elencoStudenti = new ArrayList<Studente>();
            try {
                System.out.println("Sto iniziando a leggere il file " + nomeFileDaLeggere);
                reader = new BufferedReader(new FileReader(nomeFileDaLeggere));
                String linea = reader.readLine();
                StringTokenizer st = new StringTokenizer(linea);
                while (linea != null) {
                    System.out.println(linea);
                    while (st.hasMoreTokens()) {
                        studente.nome = st.nextToken();
                        studente.cognome = st.nextToken();
                        studente.matricola = st.nextToken();
                        }
                    linea = reader.readLine();
                    elencoStudenti.add(studente);
                }
            } catch (FileNotFoundException e) {
                System.out.println("Non ho trovato il file " + nomeFileDaLeggere);
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (reader != null) {
                        reader.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("Ho finito di leggere dal file " + nomeFileDaLeggere + " e l'ho chiuso!");
            return elencoStudenti;
        }
    
    
        public void stampaDati(ArrayList<Studente> v) {
            System.out.println(v);
        }
    
    
        public void stampaReverse(ArrayList<Studente> v) {
            Collections.reverse(v);
            System.out.println(v);
        }
        
        public static void main(String[] args) {
            GestioneRegistro registro = new GestioneRegistro();
            ArrayList<Studente> elenco = registro.letturaDati("./archivio.txt");
            registro.stampaDati(elenco);
            registro.stampaReverse(elenco);
        }
    }

    Grazie mille a chiunque sia disposto a darmi una mano!
    Ultima modifica di shaqino; 05-10-2015 a 09:47

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,306
    Quote Originariamente inviata da shaqino Visualizza il messaggio
    So che la StringTokenizer è deprecata
    A me non risulta... è presente anche nella JSE8 e da nessuna parte è stato deprecato alcunchè di tale classe.

    Il tuo problema deriva dal fatto che, ad ogni ciclo, continui ad usare sempre la stessa istanza della classe Studente. Di conseguenza, ad ogni ciclo continui a modificare sempre la stessa istanza e continui ad aggiungerla all'ArrayList. Quello che devi fare è creare una nuova istanza della classe Studente (si usa l'operatore new) ad ogni ciclo di lettura. E' un errore classico, non ti preoccupare. Ci cascano tutti all'inizio.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Grazie per la risposta, ho sbagliato ad esprimermi io, avevo letto che non la si usa più perchè si preferisce la split e la StringTokenizer è stata mantenuta per questioni di compatibilità....

    Ad ogni modo, ho provato a istanziare sempre un nuovo studente, ma il problema della ripetizione persiste e ci sto sbattendo la testa da due giorni. A logica dovrei metterlo alla fine di ogni ciclo di tokenizzazione, ma anche in quel caso mi ripete le stringhe. Ho provato dunque a metterlo al di fuori. STessa cosa... non capisco più da che parte sbattere la testa...

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,306
    Posta il codice modificato.
    Attenzione che non dovresti istanziarlo per ogni ciclo di tokenizzazione, ma per ogni ciclo di lettura dal file.

    E, a tal proposito, puoi sintetizzare la lettura e controllo fine file in un unico modo, nel while:


    codice:
    String linea = null;
    while((linea = br.readLine()) != null) {
       ...
    }

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    codice:
    while ((linea = reader.readLine()) != null) {				System.out.println(linea);
    				while (st.hasMoreElements()){
    					nome = st.nextElement().toString();
    					cognome = st.nextElement().toString();
    					matricola = st.nextElement().toString();
    				}  
    				studente = new Studente (nome, cognome, matricola);
    				elencoStudenti.add(studente);
    				linea = reader.readLine();
    				
    			}

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,306
    Ad ogni lettura dal file dovresti ricreare un nuovo StringTokenizer con la nuova riga letta...

    Attenzione che non lo stai usando correttamente lo StringTokenizer. Dovresti usare il ciclo while per scorrere ogni token della stringa... quindi, per ciascuna iterazione dovresti capire quale token stai leggendo (leggerai prima il nome, poi il cognome e poi la matricola) e assegnare il valore alla giusta variabile; diciamo che se sei sicuro che ciascuna riga contenga esattamente tre token, allora puoi evitare questo controllo e fare come hai fatto tu.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Ok perfetto, ora ho capito finalmente l'errore e l'ho corretto.
    Per quanto riguarda l'utilizzo di StringTokenizer ho capito quello che dici, ma siccome nell'esercizio veniva richiesto di creare il proprio file di archivio come esempio ho semplificato la cosa. Poi vedrò se l'insegnante mi farà la stessa critica e come correggerla. Grazie mille!

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 © 2024 vBulletin Solutions, Inc. All rights reserved.