Esercizio Java pareri

Robert T.

Utente Attivo
Dato questo esercizio:

Testo Esercizio:
Il lettore si limiti a simulare la seguente situazione:

una rubrica contiene informazioni(nome,indirizzo,numero telefono) su un certo numero di persone prestabilito (le informazioni sono preintrodotte nel metodo main()). L'utente dovrà fornire alll'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.

Inizialmente l'ho svolto usando un ciclo if, solo che dopo ho pensato che se in futuro bisogna aggiungere un vasto numero di persone un ciclo switch sarebbe molto più comprensibile e agevolo da utilizzare. Ho trovato opportuno creare un costruttore, dato che in caso si fossero applicati più metodi oltre a nome,indirizzo ecc.. sarebbe stato estenuante chiamare in continuazione i metodi. Dunque meglio settarli direttamente quando viene istanziato il cliente. Ho settato la stringa inviata dall'utente automaticamente in caratteri lowercase per evitari errori di maiuscolo e minuscolo.

Secondo me l'esercizio è fatto bene, ma vorrei pareri e suggerimenti da parte di altri utenti sul forum, grazie mille.

Classe: Rubrica
Codice:
public class Rubrica {
    private String nome, indirizzo;
    private int numeroTelefono;
    
    public Rubrica(String nome, String indirizzo, int numeroTelefono){
        this.setNome(nome);
        this.setIndirizzo(indirizzo);
        this.setNumeroTelefono(numeroTelefono);
    }
    
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public String getIndirizzo() {
        return indirizzo;
    }
    public void setIndirizzo(String indirizzo) {
        this.indirizzo = indirizzo;
    }
    public int getNumeroTelefono() {
        return numeroTelefono;
    }
    public void setNumeroTelefono(int numeroTelefono) {
        this.numeroTelefono = numeroTelefono;
    }


    
}

Il main:
Codice:
import java.util.*;
public class DammiInfoRubrica {
    public static void main(String[] args) {
        
        String personaInfo;
        
        Scanner input = new Scanner(System.in);
        Rubrica Robert = new Rubrica("Robert", "Via dei qualcosa", 123);
        Rubrica Roberto = new Rubrica("Roberto", "Via dei qualcosina", 321);
        
        System.out.println("Di quale persona vuoi sapere le info?");
        personaInfo = input.nextLine();
        personaInfo.toLowerCase();
        
        
        switch(personaInfo){
            case "robert" :                
                System.out.println("Nome :" + Robert.getNome() +  "\n" + "Indirizzo :"  + Robert.getIndirizzo() + "\n" +"Numero di telefono :" + Robert.getNumeroTelefono());
            break;
                 
            case "roberto" :
                System.out.println("Nome :" + Roberto.getNome() +  "\n" + "Indirizzo :"  + Roberto.getIndirizzo() + "\n" +"Numero di telefono :" + Roberto.getNumeroTelefono());
            break;
            
            default:
                System.out.println("La persona non esiste nel nostro registro");
        }
        
        
        input.close(); // Chiudo lo scanner
    }
}
 
Ultima modifica:

DispatchCode

Utente Attivo
593
342
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
Ciao,


Si, mi sembra possa andare. Potrebbe essere opportuno - anche se non richiesto magari - gestire l'eventuale eccezione che può essere lanciata da nextLine() (mi riferisco in particolare a NoSuchElementException).
 

1nd33d

Utente Attivo
652
279
Hardware Utente
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
Hard Disk
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
Scheda Video
XFX RX480 GTR Black Edition
Scheda Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
Alimentatore
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
Sistema Operativo
Windows 10 64bit - Linux Mint 18
Il programma va bene, però non "scala", cioè non si adatta ad eventi di inserimento o a voci in rubrica diverse da quelle che hai specificato ("robert" e "roberto").
C'è in primis un difetto "concettuale": la "Rubrica" è un insieme di voci, ma tu usi la classe Rubrica per ogni singola voce.
Inoltre devi creare un oggetto a parte (ed assegnargli un nome) per ogni voce della rubrica, il che non scala per nulla. Prova per esempio a creare un metodo per inserire una voce in rubrica, come fai?
La cosa più banale che puoi fare è creare una lista di Voci (quelle che tu definisci con la classe "Rubrica" che a questo punto meriterebbe una rinominazione in "Voce").
In questo modo la ricerca poi avviene leggendo la lista e cercando il match con il nome.

Per ora prova a gestire l'immissione di nuove voci da parte dell'utente.

ps: "if" e "switch" non sono cicli, ma strutture di controllo condizionale.
 

Robert T.

Utente Attivo
Il programma va bene, però non "scala", cioè non si adatta ad eventi di inserimento o a voci in rubrica diverse da quelle che hai specificato ("robert" e "roberto").
C'è in primis un difetto "concettuale": la "Rubrica" è un insieme di voci, ma tu usi la classe Rubrica per ogni singola voce.
Inoltre devi creare un oggetto a parte (ed assegnargli un nome) per ogni voce della rubrica, il che non scala per nulla. Prova per esempio a creare un metodo per inserire una voce in rubrica, come fai?
La cosa più banale che puoi fare è creare una lista di Voci (quelle che tu definisci con la classe "Rubrica" che a questo punto meriterebbe una rinominazione in "Voce").
In questo modo la ricerca poi avviene leggendo la lista e cercando il match con il nome.

Per ora prova a gestire l'immissione di nuove voci da parte dell'utente.

ps: "if" e "switch" non sono cicli, ma strutture di controllo condizionale.
Riflettendoci hai ragione, ogni vuola creo una Rubrica, riguardo a:

cioè non si adatta ad eventi di inserimento o a voci in rubrica diverse da quelle che hai specificato ("robert" e "roberto").
L'esercizio chiede che siano prestabiliti. Ho modificato in questo modo, ci ho messo il main dentro per non allargare le classi dato che l'esercizio è piccolo:



Codice:
import java.util.*;
public class Voce extends Rubrica{
    private int voce;
    public Voce(String nome, String indirizzo, int numeroTelefono, int voce){    
        super(nome, indirizzo, numeroTelefono);
        this.setVoce(voce);
    }
    public int getVoce() {
        return voce;
    }
    public void setVoce(int voce) {
        this.voce = voce;
    }
    
    public static void main(String[] args) {
        
    String personaInfo;
        
        Scanner input = new Scanner(System.in);
        Voce Robert = new Voce("Robert", "Via dei qualcosa", 123, 1);
        Voce Roberto = new Voce("Roberto", "Via dei qualcosina", 321,2);
        System.out.println("Di quale persona vuoi sapere le info?");
        personaInfo = input.nextLine();
        
        switch(personaInfo.toLowerCase()){
            case "robert" :                
                System.out.println("Voce:" + Robert.getVoce() + "Nome :" + Robert.getNome() +  "\n" + "Indirizzo :"  + Robert.getIndirizzo() + "\n" +"Numero di telefono :" + Robert.getNumeroTelefono());
            break;
                
            case "roberto" :
                System.out.println("Voce:" + Roberto.getVoce() + "Nome :" + Roberto.getNome() +  "\n" + "Indirizzo :"  + Roberto.getIndirizzo() + "\n" +"Numero di telefono :" + Roberto.getNumeroTelefono());
            break;
            
            default:
                System.out.println("La persona non esiste nel nostro registro");
        }
        
        
        input.close(); // Chiudo lo scanner
        
        
    }
    
}
@DispatchCode come suggerisci di gestire l'eccezione ?
 
Ultima modifica:

BAT00cent

Utente Attivo
1,000
428
Hardware Utente
L'esercizio secondo me non va bene, non sono stati modellati i dati come si dovrebbe;
quello che tu hai chiamato "Rubrica" è in realtà un singolo elemento (potresti chiamarlo Item) della rubrica;
una rubrica è semplicemente un insieme di Item (da implementare a tua scelta con una lista, un array ecc ecc.).
quindi per inserire in Rubrica dovrai fire innanzitutto la creazione di un oggetto Item e poi invocare sulla rubrica un metodo di aggiunta (per es. se usi un semplice ArrayList ti basta un add).
Nella classe che definisce un elemento da inserire in Rubrica, ti suggerisco di ridefinire il metodo toString che, a partire da un Item restituisce una stringa che descrive l'item; in questo modo nel main non sarà più necessario stampare le singole componenti, ma semplicemente fare il classico
System.out.println(oggettoItem)

P.S.
un numero di telefono non è un int, poiché milioni di numeri telefonici iniziano per 0, per esempio a Roma il servizio chiamta taxi è 060609, non lo puoi rappresentare come un int, così come nessun numero telefonico con prefisso che inizi per 0
dovresti definire il num. di telefono a sua volta come stringa
 
Ultima modifica:

Robert T.

Utente Attivo
L'esercizio secondo me non va bene, non sono stati modellati i dati come si dovrebbe;
quello che tu hai chiamato "Rubrica" è in realtà un singolo elemento (potresti chiamarlo Item) della rubrica;
una rubrica è semplicemente un insieme di Item (da implementare a tua scelta con una lista, un array ecc ecc.).
quindi per inserire in Rubrica dovrai fire innanzitutto la creazione di un oggetto Item e poi invocare sulla rubrica un metodo di aggiunta (per es. se usi un semplice ArrayList ti basta un add).
Nella classe che definisce un elemento da inserire in Rubrica, ti suggerisco di ridefinire il metodo toString che, a partire da un Item restituisce una stringa che descrive l'item; in questo modo nel main non sarà più necessario stampare le singole componenti, ma semplicemente fare il classico
System.out.println(oggettoItem)

P.S.
un numero di telefono non è un int, poiché milioni di numeri telefonici iniziano per 0, per esempio a Roma il servizio chiamta taxi è 060609, non lo puoi rappresentare come un int, così come nessun numero telefonico con prefisso che inizi per 0
dovresti definire il num. di telefono a sua volta come stringa

Grazie per i suggermineti, gentilmente potresti stendere un pò di codice in modo da riuscire a orientarmi. Sono un pò confuso sulla parte degli item e come strutturare il tutto.

Riguardo al toString hai ragione è molto più versatile in questo modo, ho fatto cosi:

Codice:
public String toString(){
		return  this.getNome() + this.getIndirizzo() + this.getNumeroTelefono() + this.getVoce();
	}
in modo da eseguire la chiamata cosi nomeoggetto.toString
 
Ultima modifica:

1nd33d

Utente Attivo
652
279
Hardware Utente
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
Hard Disk
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
Scheda Video
XFX RX480 GTR Black Edition
Scheda Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
Alimentatore
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
Sistema Operativo
Windows 10 64bit - Linux Mint 18

L'esercizio chiede che siano prestabiliti.
Ciò non toglie che comunque è impostato male.
L'esercizio dice che siano prestabiliti per concentrarti solo sulla ricerca, ma sei stato tu a decidere che siano solo 2 voci... Se l'esercizio ti dicesse che ne devi avere, sempre prestabilite, 10? o 100? fai uno switch con 100 rami?
Non sto dicendo che l'algoritmo sia sbagliato, dico che l'idea risolutiva è povera, ed è qui che la puoi migliorare.

L'idea è rendere la ricerca indipendente sia dai singoli nomi della rubrica (tu fai uno switch sui singoli nomi, che devi conoscere a priori, e non possono essere modificati), sia dal numero degli stessi, anche se vengono cancellati o aggiunti. Che poi siano prestabiliti o meno è un altro dicorso, è una semplificazione che però può portarti a scrivere un codice bruttino e praticamente "inutile" per lo studio.
Infatti l'esercizio che stai facendo suppongo sia preso da una certa guida (dove tra l'altro suggerisce in esempio, 5 voci)... che quando propone quell'esercizio ha già trattato, capitoli prima, gli array, che qui potresti benissimo usare visto che il numero di voci è, appunto, fisso. Ancora meglio sarebbero le collezioni per gestire rubriche di dimensione arbitraria, ma forse non le hai ancora viste.
 

DispatchCode

Utente Attivo
593
342
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
Dovresti racchiudere la lettura in un blocco try e gestirla con l'apposito catch.

Ti stanno dicendo di modellare meglio i dati della classe. Quello che tu chiami ora Rubrica, dovrebbe essere nominato Item (o in altro modo opportuno). A questo punto potrai fare una classe Rubrica che contiene un java.util.ArrayList per contenere tutti i singoli Item. Questi Item verranno aggiunti tramite un apposita interfaccia da te predisposta (un metodo add()).

Sarebbe quindi il caso, a questo punto, secondo me, di fare una cosa di questo tipo:

1) Classe Item per memorizzare i singoli elementi (nome, numero, etc..); in effetti come hanno fatto giustamente notare il numero non va bene come intero;
2) Classe Rubrica che contiene ad esempio un array di Item, con apposite interfacce per la gestione di questi dati;
3) Classe che definisce il metodo main() e crea una Rubrica ed i vari Item (da inserire nella rubrica, tipo rubrica.add(item));


EDIT:
Chiedo venia, stavo scrivendo e non ho refreshato la pagina non vedendo 1nd33d
 

Robert T.

Utente Attivo
@DispatchCode @1nd33d @BAT00cent

Grazie a tutti per i consigli. Solo una cosa non ho capito, riguardo a nome indirizzo e telefono, dovrei lasciar perdere le singole varibili e metterli direttamente in array?

P.s.: grazie per la pazienza ma certe cose ancora non le mastico bene soprattutto gli array
 

DispatchCode

Utente Attivo
593
342
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
Dovresti cambiare il tipo di dato per il numero di telefono ed utilizzare a sua volta il tipo String.

L'array serve a contenere gli Item. Ma se utilizzi un normale array dovrai specificare una dimensione fissa, non più modificabile (salvo creazione di nuovo array e copia degli elementi). Quindi ti conviene utilizzare un array dinamico, un ArrayList, che si occupa da solo dell'allocazione degli elementi.
 

Robert T.

Utente Attivo
Dovresti cambiare il tipo di dato per il numero di telefono ed utilizzare a sua volta il tipo String.

L'array serve a contenere gli Item. Ma se utilizzi un normale array dovrai specificare una dimensione fissa, non più modificabile (salvo creazione di nuovo array e copia degli elementi). Quindi ti conviene utilizzare un array dinamico, un ArrayList, che si occupa da solo dell'allocazione degli elementi.
Riguardo al numero di telefono ho capito, sta sera cercherò di schiarirmi le idee sugli arraylist.

Cioè faccio un array su una persona intera o faccio un array sulla lista dei nomi dei clienti, indirizzi telefono ecc....?
 

DispatchCode

Utente Attivo
593
342
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
L'array contiene gli Item. Ogni item verrà aggiunto all'array (o arraylist) attraverso la classe Rubrica. Ciascuno di questi Item è composto da nome, telefono, indirizzo ed altri eventuali dati.
 

Robert T.

Utente Attivo
@DispatchCode @1nd33d @BAT00cent

Per ora ho cacciato fuori questo codice:

IMPOSTO IL COMPORTAMENTO DEI DATI
Codice:
public class Item {
    private String nome,indirizzo,cellulare;
    
    public Item(String nome, String indirizzo, String cellulare){
        this.nome = nome;
        this.indirizzo = indirizzo;
        this.cellulare = cellulare;
    }
    
    public String toString(){
        return this.getNome() + this.getIndirizzo() + this.getCellulare();
    }


    public String getNome() {
        if(!this.nome.isEmpty()){
            return this.nome;
        }
        else{
            return "Sconosciuto";
        }
    }


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


    public String getIndirizzo() {
        if(!this.indirizzo.isEmpty()){
            return this.indirizzo;
        }
        else {
            return "Sconosciuto";
        }
    }


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


    public String getCellulare() {
        if(!this.cellulare.isEmpty()){
            return this.cellulare;
        }
        else {
            return "Sconosciuto";
        }
    }


    public void setCellulare(String cellulare) {
        this.cellulare = cellulare;
    }
}


CREO ARRAY LIST:

Codice:
import java.util.*;


public class Voci {
    public Voci(){
        ArrayList<Item> voce = new ArrayList<Item>();
        
        voce.add(new Item("Robert", "Via qualcosa", "123"));
        voce.add(new Item("Roberto","Via qualcosina", "123"));
        
        
    }
}


Ora sto cercando di trovare un buon modo per estrapolare i dati in base al nome che digito da tastiera.

- - - Updated - - -

@DispatchCode @1nd33d @BAT00cent

Per ora ho cacciato fuori questo codice:

IMPOSTO IL COMPORTAMENTO DEI DATI
Codice:
public class Item {
    private String nome,indirizzo,cellulare;
    
    public Item(String nome, String indirizzo, String cellulare){
        this.nome = nome;
        this.indirizzo = indirizzo;
        this.cellulare = cellulare;
    }
    
    public String toString(){
        return this.getNome() + this.getIndirizzo() + this.getCellulare();
    }


    public String getNome() {
        if(!this.nome.isEmpty()){
            return this.nome;
        }
        else{
            return "Sconosciuto";
        }
    }


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


    public String getIndirizzo() {
        if(!this.indirizzo.isEmpty()){
            return this.indirizzo;
        }
        else {
            return "Sconosciuto";
        }
    }


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


    public String getCellulare() {
        if(!this.cellulare.isEmpty()){
            return this.cellulare;
        }
        else {
            return "Sconosciuto";
        }
    }


    public void setCellulare(String cellulare) {
        this.cellulare = cellulare;
    }
}


CREO ARRAY LIST:

Codice:
import java.util.*;


public class Voci {
    public Voci(){
        ArrayList<Item> voce = new ArrayList<Item>();
        
        voce.add(new Item("Robert", "Via qualcosa", "123"));
        voce.add(new Item("Roberto","Via qualcosina", "123"));
        
        
    }
}


Ora sto cercando di trovare un buon modo per estrapolare i dati in base al nome che digito da tastiera.
Dopo ore di scervellamento sono arrivato alla scrittura di questo codice semplice ma efficace, spero che vada bene! :bevuta:

La classe item è rimasta invariata, ma la classe voci l'ho cambiata cosi:

Codice:
import java.util.*;






public class AggPersone {
    public static void main(String[] args) {
        
        
        ArrayList<Item> voce = new ArrayList<Item>();
        
        voce.add(new Item("Robert", "Via qualcosa", "123"));
        voce.add(new Item("Roberto","Via qualcosina", "123"));
        
        Scanner input = new Scanner(System.in);
        System.out.println("chi cerchi?");
        String chiave = input.nextLine();
        
        
        for(int i = 0; i < voce.size(); i++){
            if(voce.get(i).getNome().equals(chiave)){
                System.out.println(voce.get(i).toString());
            }
        }
        
      input.close();

    }
}

Itera tutti gli array uno per uno e quando trova un match del nome inserito col nome nell'array stampa tutta la riga dell'array. Ora c'è un altro problema, se faccio una ricerca a vuoto non so come mandare in stampa il fatto che non si hanno riscontri. :retard:

- - - Updated - - -

Rieccomi!

Mi sono fatto due conti da solo e dato che è un ciclo che non si sa quante iterazioni avrà è più opportuno utilizzare un while no? allora ho cambiato il codice cosi e funziona anche lanciando una ricerca a vuoto :luxhello:


Codice:
int i = 0;
        while(i < voce.size()){
            if(voce.get(i).getNome().equals(chiave)){
                System.out.println(voce.get(i).toString());
            }
            
            i++;
            
            if(i == voce.size()){
                System.out.println("Nessun match");
            }
        }
 
Ultima modifica:

dovah

Utente Attivo
151
45
Hardware Utente
CPU
i7 6700k
Dissipatore
Noctua NH-D15s
Scheda Madre
ASRock Z170 Extreme4
Hard Disk
Crucial M550 500GB + Seagate Barracuda 2TB
RAM
CMK16GX4M2A2400C14
Scheda Video
Sapphire Nitro+ RX 480 OC 8GB
Monitor
Asus VG245H
Alimentatore
EVGA G2 650W
Case
AeroCool Aero 1000
La differenza tra for e while è inesistente concettualmente, deve esistere un caso per il quale il ciclo si interromperà, salvo alcune eccezioni.
Si sa benissimo quante iterazioni ci sono da compiere: voce.size().
Ed infatti è la stessa condizione che avevi posto nel for precedentemente: i < voce.size()
Inoltre ti suggerisco di rinominare l'arraylist voce in rubrica, ha più senso in quanto una rubrica è un elenco di voci...

Hai un modo (diciamo due) più elegante per verificare se non ci sono match.
Il primo approccio è più strutturato, il secondo più javoso (a mio modo di dire).

Primo modo:
Codice:
int i = 0;
boolean match = false;

while (!match && i < rubrica.size()) {
    if (rubrica.get(i).getNome().equals(chiave)) {
        match = true;
        System.out.println(rubrica.get(i));
    }
}

if (!match) {
    System.out.println("Nessun match");
}
in questo modo, al primo match la ricerca si ferma, senza scorrere fino in fondo la lista.
Potresti sfruttare questa struttura differentemente, salvando la posizione in cui c'è il match o -1 se non ce ne sono.
Il senso è questo.

Il secondo modo prevede di fare l'override del metodo equals della class Item implementandolo come controllo del nome, nel caso di oggetti di tipo String. Per concludere usi il metodo indexOf della classe ArrayList per trovare il match che restituisce l'indice dell'elemento o -1 in caso di fallimento.
 
Ultima modifica:

DispatchCode

Utente Attivo
593
342
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
Per ora ho cacciato fuori questo codice:

IMPOSTO IL COMPORTAMENTO DEI DATI
Codice:
public class Item {
    private String nome,indirizzo,cellulare;
    
    public Item(String nome, String indirizzo, String cellulare){
        this.nome = nome;
        this.indirizzo = indirizzo;
        this.cellulare = cellulare;
    }
    
    public String toString(){
        return this.getNome() + this.getIndirizzo() + this.getCellulare();
    }


    public String getNome() {
        if(!this.nome.isEmpty()){
            return this.nome;
        }
        else{
            return "Sconosciuto";
        }
    }


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


    public String getIndirizzo() {
        if(!this.indirizzo.isEmpty()){
            return this.indirizzo;
        }
        else {
            return "Sconosciuto";
        }
    }


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


    public String getCellulare() {
        if(!this.cellulare.isEmpty()){
            return this.cellulare;
        }
        else {
            return "Sconosciuto";
        }
    }


    public void setCellulare(String cellulare) {
        this.cellulare = cellulare;
    }
}

A mio avviso va quasi bene, ci sono però cose che dovresti evitare, a voler essere puntigliosi.
Piccolo appunto prima: se restituisci gli elementi con toString() in quel modo non avrai spazio tra le informazioni. Quindi concaena degli spazi e magari formattalo in modo più carino.
Ciò che non è propriamente corretto è il modo in cui gestisci i getXxx(). Se restituisci "Sconosciuto" il chiamante dovrà sottostare forzatamente a questa stringa, e si ritrova una stringa "Sconosciuto" di ritorno dal metodo. L'approccio corretto vedrebbe il ritorno della stringa così com'è, starà al chiamante personalizzare il messaggio che vuole mostrare. Inoltre non è esattamente corretto ciò che fai con isEmpty().


CREO ARRAY LIST:

Codice:
import java.util.*;


public class Voci {
    public Voci(){
        ArrayList<Item> voce = new ArrayList<Item>();
        
        voce.add(new Item("Robert", "Via qualcosa", "123"));
        voce.add(new Item("Roberto","Via qualcosina", "123"));
        
        
    }
}
Questo invece non va proprio benissimo, anzi.

Dovresti fare qualcosa di questo tipo:
Codice:
import java.util.ArrayList;

class Voci {
  private ArrayList<Item> elencoItem;

  Voci() {
    elencoItem = new ArrayList<Item>();
  }

  // Qui crei dei metodi getter/setter, tipo:
  void addItem(Item item) {
    // .....
  }
Magari verificando che l'item che vai ad aggiungere non esista già (vedi tu se verificare che il nome debba essere diveso così come il telefono, ad esempio). Magari in quel caso puoi usare un metodo con firma boolean (se non verrà inserito, restituirà false).


La classe item è rimasta invariata, ma la classe voci l'ho cambiata cosi:

Codice:
import java.util.*;

public class AggPersone {
    public static void main(String[] args) {
        
        
        ArrayList<Item> voce = new ArrayList<Item>();
        
        voce.add(new Item("Robert", "Via qualcosa", "123"));
        voce.add(new Item("Roberto","Via qualcosina", "123"));
        
        Scanner input = new Scanner(System.in);
        System.out.println("chi cerchi?");
        String chiave = input.nextLine();
        
        
        for(int i = 0; i < voce.size(); i++){
            if(voce.get(i).getNome().equals(chiave)){
                System.out.println(voce.get(i).toString());
            }
        }
        
      input.close();

    }
}

Itera tutti gli array uno per uno e quando trova un match del nome inserito col nome nell'array stampa tutta la riga dell'array. Ora c'è un altro problema, se faccio una ricerca a vuoto non so come mandare in stampa il fatto che non si hanno riscontri. :retard:
Questo di conseguenza dovrà essere cambiato. Il metodo main() conterrà la creazione dell'oggetto Voci (o come vorrai chiamare la classe) e la creazione degli Item.

Inoltre attenzione ai termini che utilizzi: non iteri tutti gli array; iteri gli elementi che compongono l'array.

Mi sono fatto due conti da solo e dato che è un ciclo che non si sa quante iterazioni avrà è più opportuno utilizzare un while no? allora ho cambiato il codice cosi e funziona anche lanciando una ricerca a vuoto :luxhello:


Codice:
int i = 0;
        while(i < voce.size()){
            if(voce.get(i).getNome().equals(chiave)){
                System.out.println(voce.get(i).toString());
            }
            
            i++;
            
            if(i == voce.size()){
                System.out.println("Nessun match");
            }
        }
Come ti è già stato suggerito non ci sono differenze tra for/while. Non so come verrà compilato in bytecode, ma è altamente probabile che anche in Java un for ed un while verranno tradotti allo stesso modo.
Condivido i consigli di dovah, forse scriverei diversamente il codice, come:

Codice:
int i = 0;
while(i++ < rubrica.size()) {
  if(rubrica.get(i).getNome().equals(chiave)) {
    System.out.println(rubrica.get(i));
    break;
  }
}

if(i == rubrica.size()-1) {
  System.out.println("Nessun match");
}
 

Entra

oppure Accedi utilizzando