Pagina 3 di 4 primaprima 1 2 3 4 ultimoultimo
Visualizzazione dei risultati da 21 a 30 su 38
  1. #21
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Tranquillo, abbiamo quasi scritto in contemporanea :-)
    Come dicevo, un problema risolto! E subito un altro che se ne presenta...
    Dicevi infatti:

    Tenendo la tua architettura attuale, in Utente aggiungi anche la informazione di utentePresentato (non solo utentePresentante). Perché? Pensaci .... così puoi legare i due utenti presentato e presentatore.
    Quando crei un nuovo utente passando un "presentatore" fai in modo che il utentePresentato di presentatore faccia riferimento al this del nuovo utente che stai creando. Così sono legati e se successivamente si tenta di creare un nuovo utente con quello stesso "presentatore", puoi verificare che il suo utentePresentato sia null o no.
    Se aggiungo il campo utentePresentato al costruttore mi resta sempre il "problema del fondatore": infatti appena è istanziato non ha ancora presentato nessuno...quindi non posso mettere nel suo costruttore il campo utentePresentato, oppure devo poterlo mettere null alla creazione e...mi sto incartando!!

  2. #22
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Quote Originariamente inviata da andbin Visualizza il messaggio

    Una soluzione è usare un metodo di "factory", in Utente metti un metodo statico creaFounder che riceve i dati nome ecc... e ovviamente creaFounder deve poter creare 1 solo fondatore, quindi un campo static per il fondatore lo devi comunque tenere.
    Qui allora o cambi radicalmente la architettura, ovvero crei una entità (=classe) SocialNetwork che contiene tutte le informazioni e associazioni tra utenti necessarie (e Utente modella solo più nome+cognome+nickname+dataNascita e basta).
    Oppure ...
    Ciao, allora ho fatto vedere al prof la classe ma mi ha detto che nella classe utente ho gestito troppe cose (il problema del fondatore in pratica). Certo poteva scrivere il testo degli esercizi in maniera differente...perché i vincoli "un utente può entrare solo se presentato da un altro utente, un utente non può presentare più di un utente" erano stati definiti nell'esercizio mentre si parlava di modellare la classe Utente, per questo ho pensato che andassero gestiti là.
    Cmq. In pratica dovrei cambiare l'architettura. Utente modella solo le informazioni sull'utente, e la classe SocialNetwork fa tutti i controlli...circa.
    Ma se nel costruttore di Utente non inserisco utentePresentante, come li implemento questi legami nel socialnetwork? Perché mi si chiede di implementare un metodo per l'inserimento di un utente

    Grazie!

  3. #23
    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
    In pratica dovrei cambiare l'architettura. Utente modella solo le informazioni sull'utente, e la classe SocialNetwork fa tutti i controlli...circa.
    Ok, e così tra l'altro è anche "modellato" in modo più sensato e realistico.

    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Ma se nel costruttore di Utente non inserisco utentePresentante, come li implemento questi legami nel socialnetwork? Perché mi si chiede di implementare un metodo per l'inserimento di un utente
    Allora è SocialNetwork che deve avere la/e struttura/e dati necessarie per mantenere tutte le associazioni e poter fare tutti i necessari controlli.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #24
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Ho più o meno fatto tutto ma mi manca la stampa degli utenti. Cioè così funziona concettualmente ma in stampa produce le stringhe con la posizione in memoria della lista (tipo socialplatform.SocialPlatform@48dbb335). Nella classe Utente ho già sovrascritto il toString di Object ma evidentemente non basta, perché qui sto operando sulla lista... come posso fare? Grazie!

    codice:
    package socialplatform;
    public class SocialPlatform {
        //classe membro statica che definisce i nodi della lista
        private static class Nodo {
            private Utente user;
            private Nodo utentePresentato;
            private static int numUtenti;
            public Nodo (Utente user, Nodo utentePresentato ) {
                this.user=user;
                this.utentePresentato=utentePresentato;
            }
        } 
        
        private Nodo top=null;
        
        //metodo per inserire un elemento nella lista
        public void push(Utente user) {
            if (user==null) {
                throw new IllegalArgumentException("Non puoi inserire un oggetto vuoto!");
            }
            top=new Nodo(user, top);
            Nodo.numUtenti++;
        }
        
        //metodo che verifica se la lista è vuota
        public boolean isEmpty() { return top==null; }
        
    
        //metodo che estrae l'ultimo elemento inserito
        public Object estrai() {
            if (isEmpty()) {
                return null;
            }
            Utente result=top.user;
            top=top.utentePresentato;
            return result;
        }
        
        //metodo che stampa gli elementi della lista
        public void stampaUtenti(SocialPlatform lista) {
            for (int i=0; i<Nodo.numUtenti; i++) {
                System.out.println(lista);
            }
        }
    }

  5. #25
    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
    in stampa produce le stringhe con la posizione in memoria della lista (tipo socialplatform.SocialPlatform@48dbb335).

    codice:
        //metodo che stampa gli elementi della lista
        public void stampaUtenti(SocialPlatform lista) {
            for (int i=0; i<Nodo.numUtenti; i++) {
                System.out.println(lista);
            }
        }
    }
    In questo stampaUtenti io vedo almeno 2 questioni: innanzitutto è un metodo di istanza di SocialPlatform .... e allora perché dovrebbe ricevere un SocialPlatform? Dovrebbe operare su quella (this) istanza di SocialPlatform, ovvero enumerare gli utenti dal 'top'.

    Seconda questione: innanzitutto se hai una lista linkata di nodi, sarebbe meglio ciclare e andare avanti nodo per nodo finché è possibile ... non fare un for fisso con il numUtenti, anche se poi è presumibile che il conteggio sia corretto.
    Inoltre non ha senso che fai un ciclo e all'interno stampi il SocialPlatform! Devi prendere utente per utente e stamparli. Come hai fatto tu richiederebbe che SocialPlatform abbia un toString() ma dovrebbe, concettualmente, fornire una stringa con tutti gli utenti e non è comunque quello che ti serve, specialmente se fai un ciclo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #26
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Quote Originariamente inviata da andbin Visualizza il messaggio
    In questo stampaUtenti io vedo almeno 2 questioni: innanzitutto è un metodo di istanza di SocialPlatform .... e allora perché dovrebbe ricevere un SocialPlatform? Dovrebbe operare su quella (this) istanza di SocialPlatform, ovvero enumerare gli utenti dal 'top'.
    Puoi spiegarti meglio?
    Tipo così:
    codice:
        public void stampaUtenti() {
                System.out.println(top.user);
        }
    Ma ovviamente riesco a stampare solo l'ultimo utente inserito...

    Quote Originariamente inviata da andbin Visualizza il messaggio
    Seconda questione: innanzitutto se hai una lista linkata di nodi, sarebbe meglio ciclare e andare avanti nodo per nodo finché è possibile ... non fare un for fisso con il numUtenti, anche se poi è presumibile che il conteggio sia corretto.
    Inoltre non ha senso che fai un ciclo e all'interno stampi il SocialPlatform! Devi prendere utente per utente e stamparli. Come hai fatto tu richiederebbe che SocialPlatform abbia un toString() ma dovrebbe, concettualmente, fornire una stringa con tutti gli utenti e non è comunque quello che ti serve, specialmente se fai un ciclo.
    Sì me ne sono accorta facendo ulteriori prove.
    NB: non posso usare un iteratore. Esiste quindi un altro modo per scorrere gli elementi di una lista?
    Inoltre mi sono accorta di aver sbagliato la stesura della classe: così come è fatta è una pila e la pila si può stampare solo svuotandola (infatti era così che ero riuscita a fare la stampa!).
    Uff non so più come fare.
    Grazie!
    Ultima modifica di Jamie04; 06-11-2013 a 22:46

  7. #27
    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
    Puoi spiegarti meglio?
    Mettiamola così: come hai fatto prima, ha senso dover fare socialY.stampaUtenti(socialX) o anche solo socialX.stampaUtenti(socialX) ?
    Direi di no ...

    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Ma ovviamente riesco a stampare solo l'ultimo utente inserito...
    Inoltre mi sono accorta di aver sbagliato la stesura della classe: così come è fatta è una pila e la pila si può stampare solo svuotandola (infatti era così che ero riuscita a fare la stampa!).
    Se inserisci 2 utenti in sequenza Utente1 poi Utente2, la struttura che ottieni è:

    codice:
           +---------------------------------+    +-----------------------------------+
    top -->|user=Utente2  utentePresentato=--|--->|user=Utente1  utentePresentato=null|
           +---------------------------------+    +-----------------------------------+
    Che è una lista linkata (tecnicamente scorribile senza alcun "svuotamento", qualunque cosa intendessi per "svuotandola") è che praticamente, descrive questo: "Utente2 è stato presentato da Utente1 il quale non è stato presentato da nessuno".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #28
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Mettiamola così: come hai fatto prima, ha senso dover fare socialY.stampaUtenti(socialX) o anche solo socialX.stampaUtenti(socialX) ?
    Direi di no ...

    Se inserisci 2 utenti in sequenza Utente1 poi Utente2, la struttura che ottieni è:

    codice:
           +---------------------------------+    +-----------------------------------+
    top -->|user=Utente2  utentePresentato=--|--->|user=Utente1  utentePresentato=null|
           +---------------------------------+    +-----------------------------------+
    Che è una lista linkata (tecnicamente scorribile senza alcun "svuotamento", qualunque cosa intendessi per "svuotandola") è che praticamente, descrive questo: "Utente2 è stato presentato da Utente1 il quale non è stato presentato da nessuno".
    Ma diciamo che a livello concettuale l'ho capito, solo che non sono capace di tradurlo in codice
    (per svuotandola intedevo che si eliminano tutti gli elementi tramite un metodo pop() che però mi consentiva di stampare correttamente...solo che poi la lista alla fine era vuota...una cosa così:

    codice:
    public Object estrai() {
            if (isEmpty()) {
                return null;
            }
            Object result=top.oggetto;
            top=top.prossimo;
            return result;
        }

  9. #29
    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
    codice:
    public Object estrai() {
            if (isEmpty()) {
                return null;
            }
            Object result=top.oggetto;
            top=top.prossimo;
            return result;
        }
    Ma non devi "toccare" top! Altrimenti è ovvio che alteri la lista!

    codice:
    Nodo nodoCorrente = top;
    
    while (nodoCorrente != null) {
        // usa 'user' di nodoCorrente
        nodoCorrente = nodoCorrente.utentePresentato;
    }
    Il while che ho scritto, scorre tutta la lista, senza alterarla. E qualunque cosa vuoi fare con 'user' la devi fare dentro il while.
    Se vuoi invece fare un metodo che estrae il "prossimo" elemento, devi mantenere lo "stato" del nodo corrente da qualche parte. Preferibilmente non in SocialPlatform ma in un oggetto apposito che incapsula la logica di iterazione, oggetto che prende il nome di "iteratore" (la interfaccia java.util.Iterator serve proprio a questo).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #30
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Ma non devi "toccare" top! Altrimenti è ovvio che alteri la lista!

    codice:
    Nodo nodoCorrente = top;
    
    while (nodoCorrente != null) {
        // usa 'user' di nodoCorrente
        nodoCorrente = nodoCorrente.utentePresentato;
    }
    Il while che ho scritto, scorre tutta la lista, senza alterarla. E qualunque cosa vuoi fare con 'user' la devi fare dentro il while.
    Se vuoi invece fare un metodo che estrae il "prossimo" elemento, devi mantenere lo "stato" del nodo corrente da qualche parte. Preferibilmente non in SocialPlatform ma in un oggetto apposito che incapsula la logica di iterazione, oggetto che prende il nome di "iteratore" (la interfaccia java.util.Iterator serve proprio a questo).
    Allora ho fatto come hai detto tu (non posso usare l'interfaccia Iterator...a tal proposito un chiarimento: ho capito male o è possibile usarla solo in classi astratte?):

    codice:
        public void stampaUtenti() {
            Nodo nodoCorrente = top;
            while (nodoCorrente != null) {
                nodoCorrente = nodoCorrente.utentePresentato;
                System.out.println(nodoCorrente);
            }
        }
    Ma mi stampa questa roba:
    socialplatform.SocialPlatform$Nodo@48dbb335
    socialplatform.SocialPlatform$Nodo@4fd281f1
    socialplatform.SocialPlatform$Nodo@5511e28
    null

    (ho definito appunto 4 utenti)

    Eppure in Utente il toString di object l'ho ridefinito. Non ci capisco più niente

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.