Rubrica Telefonica

di il
6 risposte

Rubrica Telefonica

Buonasera a tutti! Ho iniziato da un paio di giorni a studiare un po' di java da autodidatta seguendo il manuale di java 5 di Claudio De Sio Cesari. Manuale molto molto utile e anche abbastanza comprensibile. Nel capitolo 7 mi sono imbattuto in un esercizio che richiede di simulare il funzionamento di una rubrica telefonica.
Gli argomenti che sono stati trattati fino ad ora sono classi, metodi, cicli e controlli; incapsulamento, ereditarietà, polimorfismo per i metodi ( overload e override), polimorfismo per dati, parametri polimorfi, collezioni eterogenee, casting di oggetti.
Utilizzo Netbeans su linux.

Il lettore si limiti a simulare la seguente situazione:
una rubrica contiene informazioni (nome, indirizzo, numero telefonico) su un certo numero di persone (per esempio 5), prestabilito (le informazioni sono preintrodotte nel metodo main()). L’utente dovrà fornire all’applicazione un nome da riga di comando e l’applicazione dovrà restituire le informazioni relative alla persona. Se il nome non è fornito, o se il nome immesso non corrisponde al nome di una persona preintrodotta dall’applicazione, deve essere restituito un messaggio significativo. Il lettore non ha altri vincoli. Non è presentata soluzione per quest’esercizio.

La mia idea era di creare una classe rubrica che caratterizzasse oggetti che hanno nome, indirizzo e numero di telefono. In questa classe definire il costruttore e metodi accessor e mutuator per nome, indirizzo e numeto di telefono.
Poi creare la classe RubricaCerca contenente il main, nella quale venivano instanziati 5 oggetti della classe Rubrica, che prendesse in input da tastiera ( non so come usare args[0]="Nome") un nome e lo passasse ad un metodo di ricerca, metodo che intendevo posizionare dentro la classe Rubrica ma non so se è la soluzione migliore.

A questo punto i miei molteplici dubbi, derivati da una poco approfondita conoscenza del linguaggio, sono saliti a galla a più non posso. Primo tra tutti come passare una stringa presa da tastiera ad un metodo public di un altra classe e restituire il risultato della ricerca.
Di seguito il codice da me scritto fino ad ora.

package rubricacerca;


public class Rubrica {

private String nome;
private String indirizzo;
private int numero;
private String risultato;
//costruttore Rubrica
public Rubrica(String n, String ind, int num){ //tre parametri in ingresso
/*this.setN(n); // passo al mutuator n
this.setInd(ind); // passo al mutuator ind
this.setNum(num); // psso al mutuator num
*/
setNIndNum(n, ind, num);
}
//Mutuator per nome
public void setN(String n){
this.nome = n;
}
//Mutuator per indirizzo
public void setInd( String ind){
this.indirizzo = ind;
}
// mutuator per Numeroditelefono
public void setNum(int num){
this.numero = num;
}
// accessor per nome
public String getN(){
return nome;
}
//accessor per indirizzo
public String getInd(){
return indirizzo;
}
//accessor per Numero
public int getNum(){
return numero;
}
//mutuator per setNIndNum
public void setNIndNum(String n, String ind, int num){
this.setN(n);
this.setInd(ind);
this.setNum(num);
}
//accesso per NIndNum
public String getNIndNum(){
return nome + indirizzo + numero;
}
//mutuator per il risultato
public void setRisultato(String risultato ){
this.risultato = risultato;
}
// accessor per il risultato
public String getRisultato(){
return risultato;
}
//metodo di ricerca
public void cerca(String nome){
// Qui dovrei inserire il codice per la ricerca ma mi trovo in difficoltà.
}
}
}
Classe con il main


package rubricacerca;


import java.io.*;
public class RubricaCerca {


/**
* @Param args the command line arguments
*/
public static void main(String[] args) throws IOException {
Rubrica persona1 = new Rubrica("Pippo", "Roma", 5);
Rubrica persona2 = new Rubrica("Topolino", "Torino", 6);
Rubrica persona3 = new Rubrica("Paperino", "Napoli", 8);
Rubrica persona4 = new Rubrica("Pluto", "Livorno", 9);
Rubrica persona5 = new Rubrica("Archimede", "Milano", 12);

System.out.println("Inserisci un nome:\n");
InputStreamReader input = new InputStreamReader(System.in);
BufferedReader tastiera = new BufferedReader(input);

String nome = tastiera.readLine();
// da qui in poi non so proprio come continuare
}
}
Sapreste consigliarmi come andare avanti?

Grazie e scusate per il poema

6 Risposte

  • Re: Rubrica Telefonica

    Ti dirò, io l'avrei modellata in maniera diversa.
    Avrei creato una classe Contatto con gli attributi nome cognome, numero, email e così via e i metodi di set e get.
    Poi la classe Rubrica che gestiva collezioni della classe Contatto, e il main per far partire l'applicazione.
    Così è un po problematica, perché non è ben modellata, hai 5 oggetti diversi, quindi 5 entità indipendenti, separate e a se stanti in cui non potrai mai fare una ricerca.
    Invece come suggerito ti sarebbe molto semplice fare la ricerca all'interno di una collezione di dati.
  • Re: Rubrica Telefonica

    Hai ragione, creare una collezione è sicuramente un'idea migliore. Gli oggetti li instanzio sempre nel main o direttamente nella classe rubrica? Credo forse nella classe rubrica, correggimi se sbaglio.

    Come ho la possibilità di modificare il codice eseguo ed in caso chiedo ulteriori chiarimenti.
    Per adesso grazie
  • Re: Rubrica Telefonica

    Gli oggetti vanno istanziati nel main.
    Pensa ad una rubrica come una agenda.
    Se hai due Agende puoi creare due rubriche diverse
    Quindi io farei così
    nel costruttore darei il nome dell'agenda tipo "Rubrica amici" o "Rubrica personale"

    nel main
    
    Rubrica rubrica=new Rubrica("Amici");
    rubrica.addContact(new Contatto("Pippo", "Franco", 000));
    /*oppure*/
    rubrica.addContact("pippo", "franco", 000);
    /*o entrambi per overloading di metodi*/
    
    Contatto person=rubrica.searchByName("Pippo");
    Contatto person2=rubrica.searchBySurname("Franco");
    
    
    E in rubrica sviluppi tutti questi metodi inserendo i contatti in una collezione.
    In tal modo puoi lavorare in maniera pulita.
  • Re: Rubrica Telefonica

    Ok, ti chiedo scusa ma credo di essermi un po' perso xD.
    Se creo una classe "Contatto" così:
    
    public class Contatto{
    	String nome;
    	String indirizzo;
    	int numero;
    	
    	//costruttore
    	public Contatto ( String n, String ind, int num){
    		this.setNome(n);
    		this.setInd(ind);
    		this setNum(num);
    	}
    	// seguono metodi accessor e mutuator
    	public void setNome(String n){
            	this.nome = n;
        	}
        	public String getNome(){
            	return nome;
        	}
        	public void setInd(String ind){
            	this.indirizzo = ind;
        	}
        	public String getInd(){
            	return indirizzo;
        	}
        	public void setNum(int num){
            	this.numero = num;
        	}
        	public int getNum(){
            	return numero;
        	}
    }
    
    poi la collezione come la gestisco? perchè di esempi purtroppo ho visto solo il classico esempio:
    
    Object arr[] = new Object[3];
    arr[0] = "Hello World";
    arr[0] = new Class(); // qui instanzia un nuovo oggetto di Class
    ....
    
    La difficoltà che ho è nello scrivere i metodi della classe rubrica che vanno a gestire la collezione. Dai tuoi suggerimenti ho capito che la classe Rubrica dovrebbe essere più o meno così:
    
    public class Rubrica{
    	private String nomerubrica;
    
    	//costruttore del tipo
    	public Rubrica( String nome){
    		this.nomerubrica = nome;
    	}
    
    }
    
    poi non capisco come riuscire ad implementare gli altri metodi. Eccomi al 4 giorno e già sto annaspando
  • Re: Rubrica Telefonica

    La rubrica dovrebbe essere più o meno così.
    
    import java.util.LinkedList;
    
    public class Rubrica{
       private String nomerubrica;
       private LinkedList<Contatto> listacontatti;
    
       //costruttore del tipo
       public Rubrica( String nome){
          this.nomerubrica = nome;
          listacontatti=new LinkedList<Contatto>();
       }
       
       public void addContact (Contatto c){
           listacontatti.add(c);
       }
       
       public void addContact(String nome, String cognome, int numero){
            listacontatti.add(new Contatto(nome, cognome,numero));
       }
    
    }
    
    
    E' listacontatti la collezione di cui accennavo, ed è li che ti salvi la tua lista.
    Nel tuo primo post avevi già scritto che avevi già trattato le "collezioni eterogenee", che alla fine non sono altro che questi.

    Se volevi farlo con i vettori
    
    public class Rubrica{
       private String nomerubrica;
       private Contatto[] listacontatti;
       public final static int MAX_LENGHT=100;
       private int index=0;
    
       //costruttore del tipo
       public Rubrica( String nome){
          this.nomerubrica = nome;
          listacontatti=new Contatto[MAX_LENGHT];
       }
       
       public void addContact (Contatto c){
              listacontatti[index]=c;
              index++
       }
       
       public void addContact(String nome, String cognome, int numero){
            listacontatti[index]=new Contatto(nome, cognome,numero));
            index++
       }
    
    }
    
    

    Però mentre con i vettori hai la "scocciatura" di tenere traccia dell'indice, di definire un numero massimo di posizioni, problemi che non hai se crei una lista dinamica come fatto prima.

    Non farti il sangue amaro, non puoi imparare a programmare il 4 giorno, ti ci vuole molta più esperienza, studiare e fare prove.

    Ti ho scritto i primi metodi, adesso prova scrivere un search, poi puoi anche definire un delete e così via.
    Se hai problemi chiedi pure.
    Ciao.
  • Re: Rubrica Telefonica

    Ahhhhhh, ora ho le idee più chiare. Nel manuale che sto usando per studiare un po' di teoria usa il termine collezioni eterogenee solo associate all'utilizzo di array e non di liste dinamiche dalle librerie java. Per questo mi ero "fissato" sull'idea di usare gli array.
    Leggendo il tuo codice mi viene da pensare:" Dannazione era così facile, perchè non ci ho pensato io?" eheheheh grazie per i suggerimenti, ora cercherò di implementare il poco che resta da me sperando di riuscire a fare qualcosa di decente.
    Appena fatto posterò i risultati o eventuali dubbi. Grazie ancora!!!!
Devi accedere o registrarti per scrivere nel forum
6 risposte