Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 38
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442

    Gestione delle date in java e liste

    Salve,
    ho creato una classe per la gestione di un utente, fra i campi ci sono nome, cognome, data di nascita.
    Non so come gestire la data di nascita, cioè ho creato un campo Date dataNascita, ma non riesco ad usarlo, qualunque modo io usi mi dà errore, sicuramente mi sfugge qualcosa. Poi ho letto che la classe Date è in disuso e che esiste Calendar, ma anche qui non capisco come usarla, qualcuno mi può fornire gentilmente un esempio pratico?
    Inoltre, in questa classe devo praticamente implementare una lista circolare senza però utilizzare gli strumenti classici messi a disposizione da Java (es. linkedlist).
    Cioè in pratica ogni oggetto deve essere "legato" all'altro in qualche modo, perché un utente può essere oggetto di questa classe solo se è stato "presentato" da un altro utente (eccetto il fondatore, s'intende). Il prof ci ha suggerito di usare la classe ricorsivamente, tipo:
    Utente utentePresentante. Ma non so come fare i "collegamenti". Spero di essermi spiegata.
    Grazie

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Non è corretto dire che la classe Date è stata deprecata: anzi, è la classe principe per il trattamento delle date, specialmente quando queste arrivano da input utente e/o da database.

    Ciò che è stato deprecato di questa classe è la maggior parte dei suoi metodi e costruttori. Il perchè lo lascio a tua ricerca/documentazione.

    Detto questo, il campo di tipo Date va benissimo, vediamo ora come fare ad usarlo. Ci sono diversi modi per ottenere un oggetto Date, a seconda di cosa si ha in mano. Ti elenco i due principali:

    1) Utilizzare un SimpleDateFormat: metodo veloce e pratico per trasformare una stringa in un oggetto Date e viceversa.

    2) Utilizzare un Calendar (tipo GregorianCalendar): metodo veloce e pratico per ottenere una data lavorabile (modificabile, manipolabile) a partire dagli elementi base di una data/ora.

    Ti faccio due esempi, uno per ciascun tipo.
    Supponiamo che tu debba prendere la data di nascita, leggendola come stringa.

    codice:
    // Leggo la stringa dall'utente nel formato "GG/MM/AAAA"
    String data = ...
    
    // Ottengo il relativo oggetto Date:
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    Date dataNascita = null;
    try {
       dataNascita = sdf.parse( data );
    }catch (Exception e) { e.printStackTrace(); }

    Supponiamo ora, invece, di avere i vari campi della data distinti: GIORNO, MESE e ANNO su tre campi interi

    codice:
    // Supponiamo la data odierna: 24/10/2013
    int giorno = 24;
    int mese = 10;
    int anno = 2013
    
    // Ottengo un GregorianCalendar che rappresenta la data odierna
    // Attenzione al mese!! (vedi documentazione)
    GregorianCalendar gc = new GregorianCalendar(anno, mese-1, giorno);
    
    // Ora ottengo l'oggetto Date:
    Date dataOdierna = gc.getTime();

    Ti rimando alla documentazione delle due classi per approfondimenti:
    java.text.SimpleDateFormat
    java.util.GregorianCalendar

    Per la questione della lista, il suggerimento del tuo prof mi sembra corretto e non è di difficile applicazione.

    Ciao.
    Ultima modifica di LeleFT; 24-10-2013 a 12:36
    "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
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Ciao, intanto grazie per la gentile risposta.
    Non ho ben capito però come usare le date nel mio caso. Nel senso che io ho una classe che definisce l'utente così:

    codice:
    public class Utente {
        //definisco le variabili di classe
        private String nome, cognome;
        private String nickname;
        private Date dataNascita;
        private Utente fondatore;
        private Utente utentePresentante;
        
        //costruttore utente fondatore
        public Utente (String nome, String cognome, Date dataNascita) {
            this(nome,cognome,dataNascita, null);
        }
        
        //costruttore utente
        public Utente (String nome, String cognome, Date dataNascita, Utente utentePresentante) {
            this.nome=nome;
            this.cognome=cognome;
            this.dataNascita=dataNascita;
            this.utentePresentante=utentePresentante;
        }
        
        //metodi estrattori
        public String getNome() { return nome; }
        public String getCognome() { return cognome; }
        public Date getDataNascita() { return dataNascita; }
        
        //metodo che sovrascrive il toString di object per stampare l'utente
        public String toString()  {
            if (utentePresentante==null) {
                return nome + " " + cognome + " " + dataNascita;
            }
            else {
                return nome + " " + cognome + " " + dataNascita + " " + utentePresentante;
            }
        }
        public static void main (String[] args) {
            // Leggo la stringa dall'utente nel formato "GG/MM/AAAA"
            String dataNascitaFounder ="23/06/1912";
            // Ottengo il relativo oggetto Date:
            Date dataNascitaFounder;
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
            try {
            dataNascitaFounder = sdf.parse( data );}
            catch (Exception e) { e.printStackTrace(); }
            Utente founder=new Utente ("Alan", "Turing", dataNascitaFounder);
        }
    }
    Posso immaginare che invece di usare un campo Date nella classe utente dovrei usare un campo String, e poi fare quel che hai detto tu...possibile?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Innanzitutto un piccolo suggerimento: se hai una classe che "modella" una entità ben precisa (es. appunto un "utente"), non metterci dentro altre cose (es. il main() ) che non hanno a che fare direttamente con la rappresentazione di quella entità. Detto in altre parole: fai classi separate, Utente e es. ProvaUtenti.

    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Posso immaginare che invece di usare un campo Date nella classe utente dovrei usare un campo String, e poi fare quel che hai detto tu...possibile?
    Qui però devi valutare tu chi deve fare il parsing della data. Se vuoi che sia Utente a fare il parsing della data è ovviamente possibile. Basterebbe che Utente possa ricevere un String, faccia il parsing e assegni il Date ad un campo interno (quindi non cambia il tipo di campo per dataNascita).
    Però così o permetti di personalizzare il formato oppure lo rendi fisso/imposto da Utente, il che non è il massimo della flessibilità. Quindi ti sconsiglierei di fare in modo che sia Utente a fare il parsing della data.
    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
    Sep 2012
    Messaggi
    442
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Innanzitutto un piccolo suggerimento: se hai una classe che "modella" una entità ben precisa (es. appunto un "utente"), non metterci dentro altre cose (es. il main() ) che non hanno a che fare direttamente con la rappresentazione di quella entità. Detto in altre parole: fai classi separate, Utente e es. ProvaUtenti.
    Sì, lo so, ma è solo un esercizio (non è un programma serio!) e per comodità ho messo tutto insieme :-)
    Tornando alla questione della data, in realtà tutte queste cose non mi interessano: io ho solo bisogno di rappresentare un campo data ma non di manipolarlo, anzi la finalità dell'esercizio è fare la lista circolare, la data è solo una cosa su cui mi sto soffermando io. Cioè in pratica il suggerimento del prof per i campi dell'utente conteneva anche un "Date dataDiNascita", quello che io non ho capito come fare è: al momento in cui istanzio un utente con una new, tipo:
    Utente founder=new Utente ("Alan", "Turing", dataDiNascita);
    non so come passargli la data di nascita, nel senso che in qualunque formato provo a metterla mi dà errore. Forse manca qualche passaggio? Non basta definire un campo Date?

    L'opzione dell'utente che riceve una string non mi piace molto per il semplice motivo che così è poco significativo...vorrei proprio manipolare un campo Date se possibile!

    Many thanks.

    Edit: mi è venuto in mente che potevo fare così:
    Utente founder=new Utente ("Alan", "Turing", new Date(06-23-1912));

    solo che mi stampa:
    Thu Jan 01 00:59:58 CET 1970

    Se invece li metto sottoforma di (06,23,1912) ottengo un warning di utilizzo di deprecated API.
    Ultima modifica di Jamie04; 24-10-2013 a 14:33

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Lasciamo stare un attimo il fatto delle date, che più o meno ho capito.
    Quello su cui mi sto scontrando ora è una faccenda leggermente più complessa.
    Come dicevo su, devo creare una classe che definisce un utente che fa parte di un "social network".
    In questo social network si può entrare (la qual cosa si traduce in un "si può creare un oggetto") solo se presentati da un altro utente.
    Il problema è che l'utente 0 (chiamiamolo fondatore) ovviamente non ha nessuno che lo presenta, ma deve essere possibile crearlo, dato che da lui dipendono tutti gli altri...
    Il fatto è che non so come inserire questo tipo di controllo, cioè ho fatto un costruttore per un utente qualsiasi che se rileva che manca il campo utentePresentante stampa un messaggio a video, ma non so come limitare il fatto che si possa creare un solo utente che non ha il campo utentePresentante...
    L'unica soluzione che mi è venuta in mente finora è di fare una classe a parte per l'utente fondatore, ma così verrebbe meno la lista.
    Grazie.
    Ultima modifica di Jamie04; 24-10-2013 a 17:46

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Il problema è che l'utente 0 (chiamiamolo fondatore) ovviamente non ha nessuno che lo presenta, ma deve essere possibile crearlo, dato che da lui dipendono tutti gli altri...
    Il fatto è che non so come inserire questo tipo di controllo
    Il "social network", come lo hai definito tu, deve essere uno solo e quindi un solo fondatore "globale" o vuoi poter avere (potenzialmente) più "social network"? Qui è solo questione di come vuoi "modellare" le cose!

    Se è sufficiente che sia globale e non hai avuto indicazioni o restrizioni particolari, puoi mettere in Utente un campo public static final (una "costante") di tipo Utente chiamato FONDATORE e inizializzato invocando un costruttore privato che ovviamente permette l'assenza di un utente "che lo presenta".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Un unico social network globale direi (non è importante e non è richiesta questa cosa, l'esercizio è più che altro per farci prendere familiarità con le liste senza usare robe già pronte).
    Ehm...non ricordavo nemmeno che i costruttori potessero essere privati!
    Vediamo se ho capito bene quello che hai detto:
    codice:
    public class Utente {
        //definisco le variabili di classe
        private String nome, cognome;
        private String nickname;
        private Date dataNascita;
        private Utente utentePresentante;
        private static final Utente FOUNDER=new Utente("Alan", "Turing", "Fondatore", new Date(12,5,23));
        
        //costruttore founder
        private Utente (String nome, String cognome, String nickname, Date dataNascita) {
            this.nome=nome;
            this.cognome=cognome;
            this.nickname=nickname;
            this.dataNascita=dataNascita;
        }
        
        
        //costruttore utente
        public Utente (String nome, String cognome, Date dataNascita, Utente utentePresentante) {
            this.nome=nome;
            this.cognome=cognome;
            this.dataNascita=dataNascita;
            this.utentePresentante=utentePresentante;
            if (utentePresentante==null){
                System.out.println("Non puoi creare un utente che non e' stato presentato da nessuno!");
    
            }
        }
    Il primo problema che mi si presenta è: come faccio a riferirmi a FOUNDER all'esterno di questa classe?
    Cioè, nella classe UtenteTest dove creo gli utenti del social network, il primo utente che creo come fa ad aver FOUNDER come utentePresentante?
    Per di più ho provato anche a creare nella classe utenteTest un utente del social network, senza mettergli il riferimento all'utente presentante, e non funziona nemmeno. E' come se non trovasse più il costruttore, perché mi dice cannot find symbol.
    Grazie.
    Ultima modifica di Jamie04; 24-10-2013 a 19:35

  9. #9
    infatti Founder dovrebbe essere pubblica
    una variabile final static non serve a niente dichiarla privata
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Quote Originariamente inviata da schumy2000 Visualizza il messaggio
    infatti Founder dovrebbe essere pubblica
    una variabile final static non serve a niente dichiarla privata
    L'ho messa pubblica, ma non è cambiato nulla, invece ho capito che per riferirmi a FOUNDER nell'altra classe dovevo anteporre il nome della classe in cui risiede FOUNDER.
    Sono comunque in panne, ora non so come impedire che si istanzi un oggetto utente senza che abbia un riferimento a un utente presentante. Avevo pensato di risolvere col costruttore così fatto:
    codice:
        //costruttore utente
        public Utente (String nome, String cognome, String nickname, Date dataNascita, Utente utentePresentante) {
            this.nome=nome;
            this.cognome=cognome;
            this.nickname=nickname;
            this.dataNascita=dataNascita;
            this.utentePresentante=utentePresentante;
            if (utentePresentante==null){
                System.out.println("Non puoi creare un utente che non e' stato presentato da nessuno!");
                System.exit(-1);
            }
        }
    Ma a quanto pare non funziona comunque, perché se provo a creare un utente senza rif. a chi lo presenta, molto semplicemente non trova il costruttore e mi dà un errore. Perciò la parte dell'if è inutile, non è la soluzione che mi serve

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.