Semplice rubrica

di il
20 risposte

Semplice rubrica

Buona giornata, manco a dirlo ho da poco iniziato come autodidatta,
l'esercizio che mi si propone è una "semplice" Rubrica con le informazioni precaricate,
da riga di comando viene fornito un nome da ricercare e l'applicazione deve ritornare le relative informazioni o errore se non presente.
Probabilmente ho sbagliato ad impostare il problema ma non riesco ad eseguire proprio nulla dal MAIN.
Ringrazio sopratutto per la pazienza
Saluti.

Spero di aver inserito correttamente i files.

20 Risposte

  • Re: Semplice rubrica

    Non hai inserito nulla
  • Re: Semplice rubrica

    Allora sono una "bestia" non ho capito come fare.....
  • Re: Semplice rubrica

    Esaurito ha scritto:


    Allora sono una "bestia" non ho capito come fare.....
    Metti il codice tra i tag [code] [/code]
  • Re: Semplice rubrica

    Scusa pensavo di poter inviare un file.

    [ public class Persona
    {
    private String nome;
    private String indirizzo;
    private String nTel;
    private Persona contatto [];
    public Persona selezionata;


    public Persona (String nome, String indirizzo, String nTel ) // costruttore
    {
    setNome(nome);
    setIndirizzo(indirizzo);
    setNTel(nTel);
    creaContatti () ;


    } //-------------------------

    public void creaContatti ()
    {
    contatto = new Persona[5];
    Persona pers_uno = new Persona("Minni","via libertà,14","06.313195");
    Persona pers_due = new Persona("Clarabella","viale Canpagna,8","08.651491");
    Persona pers_tre = new Persona("Topolino","via Tasso,3","055.956321");
    Persona pers_qua = new Persona("Pluto","via N.York,11","055.981437");
    Persona pers_cin = new Persona("Paperino","via Uccello,41","071.365892");

    contatto[0] = pers_uno ;
    contatto[1] = pers_due ;
    contatto[2] = pers_tre ;
    contatto[3] = pers_qua ;
    contatto[4] = pers_cin ;

    // System.out.println(selezContatto (2) );
    }

    //-+++++++++++++++++++++++++++++++++++++++++
    public Persona selezContatto (int i)
    {
    Persona selezionata = contatto;
    return selezionata;
    }


    //-+++++++++++++++++++++++++++++++++++++++++
    public String leggiContatto ()
    {
    return getNome() +":"+" "+ getIndirizzo() +" Tel "+ getNTel() ;
    }

    //-++++++++++++++++++++++++++++++++++++++++
    public void setNome(String nome)
    {
    this.nome = nome;
    }

    public String getNome()
    {
    return nome;
    }

    //-+++++++++++++++++++++++++++++++++++++++++
    public void setIndirizzo(String indirizzo)
    {
    this.indirizzo = indirizzo;
    }

    public String getIndirizzo()
    {
    return indirizzo;
    }

    //-+++++++++++++++++++++++++++++++++++++++++
    public void setNTel(String nTel)
    {
    this.nTel = nTel;
    }

    public String getNTel()
    {
    return nTel;
    }


    //
    } //---fine Classe---]




    [public class Rubrica
    {


    public static void main(String args[])
    {
    Persona perSelez = new Persona("Ciccio", "Maggio", "99999" );
    // System.out.println(perSelez);


    // Persona selezionata = perSelez.selezContatto (2) ;



    /* Exception in thread "main" java.lang.StackOverflowError
    at Persona.<init>(Persona.java:15) */
    // System.out.println(perSelez.selezContatto (2) );

    }
    ]
  • Re: Semplice rubrica

    Ma non hai usato i tag code !
  • Re: Semplice rubrica

    Esaurito ha scritto:


    Scusa pensavo di poter inviare un file.
    Si può anche "allegare" uno/più file ad un post ma se si tratta di sorgenti NON è pratico per chi legge.

    Esaurito ha scritto:


    public class Persona
    {
    [....]
    Purtroppo nel tuo codice c'è relativamente poco che abbia senso. E c'è una questione subdola, quel StackOverflowError. Il costruttore di Persona chiama creaContatti(), esso crea altri oggetti Persona, ciascun costruttore chiama creaContatti() che crea altri oggetti Persona, ecc... Risultato: dopo un po' "esplode" lo stack.

    Ma il punto è che quel creaContatti() NON dovrebbe stare in Persona. Puoi creare i contatti nel main o altro metodo.
    Persona dovrebbe solo "modellare" 1 persona e basta.

    E poi .. perché ogni oggetto Persona dovrebbe avere i riferimenti ad altri oggetti Persona? Quel

    private Persona contatto [];

    Devi rivedere il design generale. Se hai dubbi, chiedi ma come hai scritto il codice, non va bene.
  • Re: Semplice rubrica

    Buona sera,
    utile la rimessa in pista, si intendeva qualcosa di simile?
    Sembra funzionare, ma riguardo il ciclo FOR non c'è qualcosa di più efficiente o pratico?
    E se volessi posizionare le 'varie persone' in un'altra CLASSE in modo da lasciare in 'main' la sola manipolazione come dovrei procedere?

    public class Persona
    {
        private String nome;
        private String indirizzo;
        private String nTel;
    
     public Persona (String nome, String indirizzo, String nTel )    // costruttore
        {
            setNome(nome);
            setIndirizzo(indirizzo);
            setNTel(nTel);
        } //-------------------------
    //-+++++++++++++++++++++++++++++++++++++++++
        public String leggiContatto ()
        {
            return getNome() +":"+"  "+ getIndirizzo() +"  Tel "+ getNTel() ;
        }
    //-++++++++++++++++++++++++++++++++++++++++
        public void setNome(String nome)
        {
            this.nome = nome;
        }
    
        public String getNome()
        {
            return nome;
        }
    //-+++++++++++++++++++++++++++++++++++++++++
      /*  altri  set e get Indirizzo() e NTel()  ........  */
    
    } //---fine Classe---
    public class Rubrica
    {
        public static void main(String args[])
        {
            int i;
            String mioContatt_ = null;	    // è meglio null oppure "" ?
            String testContatto = args[0] ;
            Persona contatto[] = new Persona[5];
    
            Persona pers_uno = new Persona("Minni","via libertà,14","06.313195");
    	Persona pers_due = new Persona("Clarabella","viale Canpagna,8","08.651491");
    	 /*altri...  pers_tre, ecc.   .....  */
    
            contatto[0] = pers_uno ;
            contatto[1] = pers_due ;
    
    	for ( i= 0; i< (contatto.length); i++)
            {
                mioContatt_ = contatto[i].getNome();
                if ( mioContatt_.equals(testContatto) )    // trovato      //!!! if (mioContatt_ == testContatto)
                {
                    System.out.println("[" + i + "] " + contatto[i].leggiContatto () );
                    break;
                }
            }
                    /* DIVERSO */
            if (!mioContatt_.equals(testContatto) )    // finiti tutti & non trovato    //!!!  if (mioContatt_ != testContatto)
            {
                System.out.println( testContatto + "  NON è in RUBRICA!" );
            }
        } //..fine-main..
    
    } //---fine Classe---
    
  • Re: Semplice rubrica

    Esaurito ha scritto:


    utile la rimessa in pista, si intendeva qualcosa di simile?
    Allora: la classe Persona grosso modo è ok anche se non si vede completa. Qualcosina si può migliorare ma se contiene solo i campi, costruttori, getter/setter, poco altro e NIENTE interazione con l'utente, è valida.
    La classe Rubrica invece mi sembra un po' più "pasticciata".

    Esaurito ha scritto:


    Sembra funzionare, ma riguardo il ciclo FOR non c'è qualcosa di più efficiente o pratico?
    E se volessi posizionare le 'varie persone' in un'altra CLASSE in modo da lasciare in 'main' la sola manipolazione come dovrei procedere?
    Se vuoi separare meglio, il main() lo metti in una classe es. GestioneRubrica (e qui fai la interazione verso l'utente) e invece la classe Rubrica la usi SOLO per modellare (con un array interno) l'insieme di N oggetti Persona. E che contiene metodi di gestione della rubrica del tipo es.:

    public Persona cercaPersonaPerNome(String nome)
  • Re: Semplice rubrica

    Grazie ci provo...
  • Re: Semplice rubrica

    Buon giorno,
    Mi sono incasinato, ho provato a fare come dicevi con "Persona cercaPersonaPerNom " ma poi in main non riesco a proseguire,
    non riesco a recuperare la stringa selezionata. Se invece uso "String cercaPersonaPerNome" sembrerebbe di si. Mi sono perso
    public class Persona
    {
        private String nome;
        private String indirizzo;
        private String nTel;
    
     public Persona (String nome, String indirizzo, String nTel )    // costruttore
        {
            setNome(nome);
            setIndirizzo(indirizzo);
            setNTel(nTel);
        } //-------------------------
    //-+++++++++++++++++++++++++++++++++++++++++
        public String leggiContatto ()
        {
            return getNome() +":"+"  "+ getIndirizzo() +"  Tel "+ getNTel() ;
        }
    
    //-++++++++++++++++++++++++++++++++++++++++
        public void setNome(String nome)
        {
            this.nome = nome;
        }
    
        public String getNome()
        {
            return nome;
        }
    
    //-+++++++++++++++++++++++++++++++++++++++++
        public void setIndirizzo(String indirizzo)
        {
            this.indirizzo = indirizzo;
        }
    
        public String getIndirizzo()
        {
            return indirizzo;
        }
    
    //-+++++++++++++++++++++++++++++++++++++++++
        public void setNTel(String nTel)
        {
            this.nTel = nTel;
        }
    
        public String getNTel()
        {
            return nTel;
        }
    
    
    //
    } //---fine Classe---
    public class Rubrica
    {
        public Persona contatto[];
        public Persona pers_due;
        public Persona pers_uno;
        public Persona pers_tre;
        public Persona pers_qua;
        public Persona pers_cin;
    //    public String mioContatt_ = null;	
        public Persona pers_Selezionata ;
        
        public Rubrica ()        // costruttore
        {
            Persona contatto[] = new Persona[5];
    
             pers_uno = new Persona("Minni","via libertà,14","06.313195");
             pers_due = new Persona("Clarabella","viale Canpagna,8","08.651491");
             pers_tre = new Persona("Topolino","via Tasso,3","055.956321");
             pers_qua = new Persona("Pluto","via N.York,11","055.981437");
             pers_cin = new Persona("Paperino","via Uccello,41","071.365892");
    
            contatto[0] = pers_uno ;
            contatto[1] = pers_due ;
            contatto[2] = pers_tre ;
            contatto[3] = pers_qua ;
            contatto[4] = pers_cin ;
        }
    //------------------------------------
    /*
        public String cercaPersonaPerNome(String nome)
        {
            System.out.println(nome);
            mioContatt_ = pers_tre.leggiContatto();    //    
            return mioContatt_ ;
    
        }
    */
    
    //------------------------------------
    
    
    /* ho ridotto all'osso senza fare realmente la ricerca per
        non aggiungere altri possibili inconvenienti, comunque alla fine 
        si userà l' array  Persona contatto[] */
    
    public Persona cercaPersonaPerNome(String nome)
        {
            System.out.println(nome);
            pers_Selezionata = pers_cin ;
            return pers_Selezionata ;
        
        } 
    
    //--
    } //---fine Classe---
    public class GestioneRubrica  
    {
     
    
        
        public static void main(String args[])
        {
    //        String testContatto = args[0] ;        // "Paperino"
            
    
    /*
            Rubrica amici = new Rubrica();
          String trovato =  amici.cercaPersonaPerNome("Pluto");
            System.out.println(trovato);
    */
            //ok        System.out.println(amici.cercaPersonaPerNome("Pluto"));  
            
    
    
    
    
    
            Rubrica amici = new Rubrica();
            Persona seLEZ = new Persona(null,null,null);
            
            seLEZ trovato = amici.cercaPersonaPerNome("Pluto");
            System.out.println(trovato);
    
    
        }
    
    
  • Re: Semplice rubrica

    Esaurito ha scritto:


    Mi sono incasinato, ho provato a fare come dicevi con "Persona cercaPersonaPerNom " ma poi in main non riesco a proseguire,
    non riesco a recuperare la stringa selezionata. Se invece uso "String cercaPersonaPerNome" sembrerebbe di si. Mi sono perso
    Rubrica infatti non va bene. Rubrica dovrebbe solo gestire l'insieme "logico" delle persone. Niente stampe o richieste all'utente.

    Abbozzando:
    public class Rubrica {
        private Persona[] persone;
    
        public Rubrica(Persona[] persone) {
            this.persone = persone;
        }
    
        public Persona cercaPersonaPerNome(String nome) {
            // scorri l'array
            //    confronta il nome della Persona i-esima con il parametro nome
            //    se uguale, restituisci l'oggetto Persona
            // altrimenti alla fine ritorna null
        }
    
        // ... altre eventuali operazioni ......
    }
    Poi nel main:
    Persona[] alcunePersone = {
        new Persona( ....... ),
        new Persona( ....... ),
        // ....
    };
    
    Rubrica rubrica = new Rubrica(alcunePersone);
    
    // .... usa rubrica per le varie operazioni
    
    La costruzione dell'array si può, volendo, anche fare "al volo" nella chiamata al costruttore Rubrica ma non volevo complicare troppo ...
  • Re: Semplice rubrica

    Ci provo, purtroppo sono un po discontinuo.
    Saluti.
  • Re: Semplice rubrica

    Buon giorno,
    spero almeno che il metodo Rubrica sia decente, però ora sono bloccato col main, non riesco a passare la stringa al metodo di ricerca.
    L'errore di variabile non-static riferita al contesto NON riesco a gestirla.
    Sicuramente devo rileggere qualche capitolo del manuale.... spero non tutto da capo.
    public class Persona
    {
        private String nome;
        private String indirizzo;
        private String nTel;
    
     public Persona (String nome, String indirizzo, String nTel )    // costruttore
        {
            setNome(nome);
            setIndirizzo(indirizzo);
            setNTel(nTel);
        } //-------------------------
    //-+++++++++++++++++++++++++++++++++++++++++
        public String leggiContatto ()
        {
            return getNome() +":"+"  "+ getIndirizzo() +"  Tel "+ getNTel() ;
        }
    
    //-++++++++++++++++++++++++++++++++++++++++
        public void setNome(String nome)
        {
            this.nome = nome;
        }
    
        public String getNome()
        {
            return nome;
        }
    
    //-+++++++++++++++++++++++++++++++++++++++++
        public void setIndirizzo(String indirizzo)
        {
            this.indirizzo = indirizzo;
        }
    
        public String getIndirizzo()
        {
            return indirizzo;
        }
    
    //-+++++++++++++++++++++++++++++++++++++++++
        public void setNTel(String nTel)
        {
            this.nTel = nTel;
        }
    
        public String getNTel()
        {
            return nTel;
        }
    
    
    //
    } //---fine Classe---
    public class Rubrica
    {
        public String mioContatt_ = null;
        private Persona[] persone;
    
        public Rubrica(Persona[] persone)
        {
            this.persone = persone;
        }
    
        public Persona cercaPersonaPerNome(String nome)
        {
            int i;
            // scorri l'array
            //    confronta il nome della Persona i-esima con il parametro nome
            //    se uguale, restituisci l'oggetto Persona
            // altrimenti alla fine ritorna null
            for ( i= 0; i< (persone.length); i++)
            {
                mioContatt_ = persone [i].getNome () ;
                if ( mioContatt_.equals(nome) )    // trovato
                {
                    System.out.println("[" + i + "] " + persone[i].leggiContatto () );
                    break ;
                }
            }
            if (!mioContatt_.equals(nome) )    // finiti tutti & non trovato    //!!!  if (mioContatt_ != testContatto)
            {
                System.out.println( nome + "  NON è in RUBRICA!" );
            }
                   
                 return persone [i] ;
            }
    
        // ... altre eventuali operazioni ......
        }
    public class GestioneRubrica
    {
        Persona[] alcunePersone =
        {
            new Persona("Minni","via libertà,14","06.313195"),
            new Persona("Topolino","via Tasso,3","055.956321"),
            new Persona("Pluto","via N.York,11","055.981437"),
        // ....
        } ;
    
        Rubrica rubrica = new Rubrica(alcunePersone);
    
    
    
        public static void main(String args[])
        {
            String testContatto = args[0] ;        // "Topolino"        
            
    /*  error: non-static variable alcunePersone cannot be referenced from a static context   */          
            Persona trovato = rubrica.cercaPersonaPerNome(testContatto);
    
    // .... usa rubrica per le varie operazioni
    
        }
    
    //---
    }
  • Re: Semplice rubrica

    Esaurito ha scritto:


    public class Rubrica
    {
        public String mioContatt_ = null;
    Questo mioContatt_ NON serve. E certamente non va bene messo lì, che è una variabile di istanza e oltretutto public.

    Esaurito ha scritto:


        public Persona cercaPersonaPerNome(String nome)
        {
            int i;
            // scorri l'array
            //    confronta il nome della Persona i-esima con il parametro nome
            //    se uguale, restituisci l'oggetto Persona
            // altrimenti alla fine ritorna null
            for ( i= 0; i< (persone.length); i++)
            {
                mioContatt_ = persone [i].getNome () ;
                if ( mioContatt_.equals(nome) )    // trovato
                {
                    System.out.println("[" + i + "] " + persone[i].leggiContatto () );
                    break ;
                }
            }
            if (!mioContatt_.equals(nome) )    // finiti tutti & non trovato    //!!!  if (mioContatt_ != testContatto)
            {
                System.out.println( nome + "  NON è in RUBRICA!" );
            }
                   
                 return persone [i] ;
            }
    
    Questo cercaPersonaPerNome si fa in modo MOLTO più semplice. Il corpo del cercaPersonaPerNome a me viene esattamente 6 righe.
    E comunque l'avevo detto, non dovrebbe essere Rubrica a stampare qualcosa all'utente.

    Esaurito ha scritto:


    public class GestioneRubrica
    {
        Persona[] alcunePersone =
        {
            new Persona("Minni","via libertà,14","06.313195"),
            new Persona("Topolino","via Tasso,3","055.956321"),
            new Persona("Pluto","via N.York,11","055.981437"),
        // ....
        } ;
    
        Rubrica rubrica = new Rubrica(alcunePersone);
    
        public static void main(String args[])
        {
    La questione è che alcunePersone e rubrica le hai dichiarate dentro la classe ma FUORI dai metodi, quindi così diventano delle variabili "di istanza". Ovvero per accedere a queste variabili devi avere un OGGETTO di tipo GestioneRubrica. Nel tuo caso non lo hai (si potrebbe fare, volendo, ma è un altro discorso).

    Quindi la soluzione più semplice è: tenere quelle due variabili come LOCALI nel main, almeno per ora.
    Non cascare su questi aspetti (che in teoria dovresti già conoscere).
Devi accedere o registrarti per scrivere nel forum
20 risposte