Visualizzazione dei risultati da 1 a 5 su 5

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    7
    Innanzitutto grazie per avermi risposto.
    Per quanto riguarda la questione del main, io in realtà sto programmando in Android e quindi
    ho scritto main solo per semplicità, comunque seguirò il tuo consiglio.
    Ho scritto in questo forum perchè comunque il mio è un problema che riguarda più il linguaggio JAVA.
    Per ciò che riguarda il metodo invece, ho difficoltà ad implementare quello che mi hai suggerito.
    Scrivo uno pseudo codice per spiegarmi:


    while ((line = reader.readLine()) != null)
    {
    String myString = line;
    Utente utente = new Utente();
    if (startWith(";")){
    utente.setNome(myString);
    }
    elseif (startWith(";;")){
    utente.setScelta(Integer.parseInt(myString));
    }
    elseif (startWith(";;")){
    // qui non capisco come implementare il
    // ciclo per riempire l'array di String "Casi"
    }
    list.add(utente);
    }


    Ho 2 problemi:
    - l'oggetto deve essere aggiunto alla lista all'interno del ciclo while
    (perchè è qui che effettuo la lettura delle righe del file)
    - i casi in realtà potrebbero anche non esserci e quindi
    list.add(utente) non può essere inserito all'interno del sottociclo
    di (startWith(";;")){ ...}


    in pratica non ho capito bene cosa intendi per salvataggio in una variabile di istanza.
    Grazie ancora.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da JavaInt Visualizza il messaggio
    Per quanto riguarda la questione del main, io in realtà sto programmando in Android
    Ok, non lo potevo sapere che si tratta di Android ma la mia indicazione di incapsulare la gestione del file in una classe a sé stante vale comunque lo stesso. Insomma è solo l'uso dei buoni principi della programmazione ad oggetti.

    Quote Originariamente inviata da JavaInt Visualizza il messaggio
    codice:
    while ((line = reader.readLine()) != null)
                {
                    String myString = line;
                    Utente utente = new Utente();
                    if (startWith(";")){
                     utente.setNome(myString);
                    }
                    elseif (startWith(";;")){
                    utente.setScelta(Integer.parseInt(myString));
                    }
                    elseif (startWith(";;")){
                    // qui non capisco come implementare il 
                    // ciclo per riempire l'array di String "Casi"
                    }                
                    list.add(utente);
                }
    Questo codice purtroppo ha parecchi problemi e "falle". Innanzitutto sei in un ciclo che legge righe continuamente (fino a eof, chiaramente). E ad ogni riga letta istanzi un oggetto Utente (ovviamente non ha senso farlo per ogni riga!). Visto che ad ogni riga hai sempre un nuovo oggetto Utente, alla riga del nome setti il nome all'oggetto Utente X e poi alla riga del numero lo setti all'oggetto Utente Y (un altro Utente). Ovviamente anche questo è sbagliato, perché non mantieni lo stesso oggetto Utente sulle N righe interessate da quel singolo utente.

    Poi comunque se non prevedi che ci sia sempre uno spazio dopo i ';', i test andrebbero fatti al contrario (prima il "marcatore" più specifico, ovvero ";;;"). Se avessi lo spazio cioè "; " / ";; " / ";;; " sarebbero inequivocabili. Se non hai lo spazio, allora testare come prima cosa solo ";" può portare ad equivoci. Se il file fosse malformato, ad esempio manca una riga del nome, tu prendi la riga del numero (che inizia comunque con un ';') e la consideri come nome. E non hai nulla nel codice che ti permette di far scoprire l'errore.

    Inoltre non fai alcun substring, quindi nome e numero li prendi con i ';' compresi (e il parseInt fallisce di certo).

    Come vedi le mancanze sono parecchie. Una lettura del genere non è difficile ma richiede un minimo di logica e ragionamento. Seguendo il mio suggerimento di incapsulare la logica in una classe a parte, si potrebbe fare (molto abbozzato!):

    codice:
    public class LettoreUtenti {
        private BufferedReader br;
        private String rigaNome;
    
        public LettoreUtenti(File file) throws ...eccezioni-necessarie... {
            // costruisci FileReader/BufferedReader
        }
    
        public void close() throws IOException {
            br.close();
        }
    
        public Utente leggiUtente() throws IOException {
            // ..... logica di lettura di 1 Utente. Ritorna null per end-of-file.
        }
    }

    Il perché ho messo la variabile di istanza 'rigaNome' l'ho spiegato nella precedente risposta.
    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 © 2026 vBulletin Solutions, Inc. All rights reserved.