Visualizzazione dei risultati da 1 a 9 su 9

Discussione: [java]uso di iterable

  1. #1
    Utente di HTML.it L'avatar di el92
    Registrato dal
    Dec 2014
    Messaggi
    177

    [java]uso di iterable

    Ciao è da poco che sto imparando ad implementare le intefacce iterator ed iterable.
    In particolare non riesco a risolvere il seguente esercizio:
    Costruisci la classe:
    * abstract Persona1

    La classe astratta Persona1 descrive una persona, caratterizzata
    da nome, cognome.
    Possiede un costruttore che permette di costruire una persona di cui
    vengono specificati dagli argomenti nome e cognome.
    Deve riscrivere i metodi toString e equals della classe Object.
    Deve inoltre implementare l'interfaccia Comparable<Persona1> in modo tale
    che le persone possano essere ordinate in ordine alfabetico (cognome poi nome).

    e vabbeh fin qui (spero) tutto a posto.

    codice:
    import java.util.*;
    abstract class Persona1 implements Comparable<Persona1>{
        String nome;
        String cognome;
    
    Persona1(String nome,String cognome){
        this.nome=nome;
        this.cognome=cognome;
    
    }
    
    public boolean equals(Persona1 p){
        boolean b=false;
        if((this.nome).equals(p.nome)&&(this.cognome).equals(p.cognome)){
            b=true;
        }
        return b;
    }
        
    public int compareTo(Persona1 p){
        int x=0;
        int result = this.cognome.compareTo(p.cognome);
        int result1 = this.nome.compareTo(p.nome);
        x=(result<0)?-1:result ==0?0:1;
     
       return x;
    }
    public String toString(){
        String s="il nome della persona è: "+nome+"\n"
        +"il cognome della persona è: "+cognome;
        return s;
    }
    }
    poi scrivi una classe :
    *Genitore

    Sottoclasse concreta della classe Persona1 che rappresenta una persona che puo' avere figli.Possiede un unico costruttore, che costruisce un genitore di cui vengono specificati
    nome e cognome e non i figli.Oltre ai metodi ereditati dalla classe Persona1 (se occorre vanno riscritti)
    deve possedere i seguenti metodi:
    - public void addFiglio(Persona1 p)
    La persona1 p viene aggiunta ai figli di questo genitore. Si assume p!=null.
    - public void sortFigli()
    Ordina i figli in ordine alfabetico.
    La classe deve implementare l'interfaccia Iterable<Persona1>;
    il metodo iterator deve restituire un iteratore per i figli.

    ecco e qui il casino:

    codice:
    import java.lang.*;
    import java.util.*;
    class Genitore extends Persona1 implements Iterable<Persona1> {
    ArrayList<Persona1> figli;
        Genitore(String nome,String cognome){
            super(nome,cognome);
            figli=new ArrayList<Persona1>();
        }
        public void addFiglio(Persona1 p){
            if(p!=null){
                figli.add(p);
            }
         }
         public void sortFigli(){
             Collections.sort(figli);
         }
    public Iterator<Persona1> iterator(){
        return figli.iterator();
    
    }
    @Override
    public String toString(){
        String t="";
        for(int pos=0;pos<figli.size();pos++){
        String t="il nome dei figli della persona sono: "+figli.get(pos);
    }
        return t;
    }
    public static void main(String[] args){
    ArrayList<Persona1> i=new ArrayList<Persona1>();
    Genitore p=new Genitore("elena","rossi");
    Genitore p1=new Genitore("alessio","rossini");
    Genitore g;
    Persona1 g1;
    g=p;
    g1=p1;
    i.add(g);
    i.add(g1);
    Collections.sort(i);
    for(Persona1 l:i){
    System.out.println(l.toString());
    }
    
    p.addFiglio(g);
    p.sortFigli();
    System.out.println(p.toString());
    }
    }

    Il compilatore mi dà un errore sulla classe Genitore di tipo:
    at java.lang.StringBuilder.append(StringBuilder.java: 115)
    at Genitore.toString(Genitore.java:46)
    at java.lang.String.valueOf(String.java:2826)
    Dopo tutta questa spataffiata di roba mio problema è:come posso dire che la persona p viene aggiunta ai figli di questo genitore?Secondo voi i metodi che ho scritto sopra sono almento concettualmente corretti?Poi l'interfaccia iterable, la posso utilizzare all'interno di una classe senza aver implementato l'interfaccia iterator?
    scusate per il messaggio troppo lungo
    Ultima modifica di el92; 13-04-2015 a 18:16

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da el92 Visualizza il messaggio
    codice:
    import java.util.*;
    abstract class Persona1 implements Comparable<Persona1>{
        String nome;
        String cognome;
    Se non ci sono motivazioni/necessità ben precise, tieni sempre i campi come 'private'.

    Quote Originariamente inviata da el92 Visualizza il messaggio
    codice:
    Persona1(String nome,String cognome){
        this.nome=nome;
        this.cognome=cognome;
    }
    Ok

    Quote Originariamente inviata da el92 Visualizza il messaggio
    codice:
    public boolean equals(Persona1 p){
        boolean b=false;
        if((this.nome).equals(p.nome)&&(this.cognome).equals(p.cognome)){
            b=true;
        }
        return b;
    }
    NO! Il metodo equals deve ricevere un Object .... non un Persona. Quello che hai fatto è un overload ... non un override. Nessuno lo userebbe a meno che sia tu a invocarlo esplicitamente e su un reference di tipo Persona1 (quindi contesto molto limitato).

    All'inizio del equals generalmente si testa l'oggetto usando l'operatore instanceof. Se non è del tipo della tua classe, si può ritornare false.

    Quote Originariamente inviata da el92 Visualizza il messaggio
    codice:
    public int compareTo(Persona1 p){
        int x=0;
        int result = this.cognome.compareTo(p.cognome);
        int result1 = this.nome.compareTo(p.nome);
        x=(result<0)?-1:result ==0?0:1;
     
       return x;
    }
    Non stai usando result1 e comunque è un po' "contorto" (si può scrivere diversamente e in modo più leggibile).


    Quote Originariamente inviata da el92 Visualizza il messaggio
    codice:
    public String toString(){
        String s="il nome della persona è: "+nome+"\n"
        +"il cognome della persona è: "+cognome;
        return s;
    }
    Ok

    Quote Originariamente inviata da el92 Visualizza il messaggio
    Il compilatore mi dà un errore sulla classe Genitore di tipo:
    at java.lang.StringBuilder.append(StringBuilder.java: 115)
    at Genitore.toString(Genitore.java:46)
    at java.lang.String.valueOf(String.java:2826)
    Che riga è la tua 46? Comunque il toString di Genitore è dubbio, in teoria non dovrebbe nemmeno compilare ... ci sono 2 variabili locali 't'.

    Quote Originariamente inviata da el92 Visualizza il messaggio
    Secondo voi i metodi che ho scritto sopra sono almento concettualmente corretti?
    Sì, perlomeno addFiglio, sortFigli e iterator sono corretti.

    Quote Originariamente inviata da el92 Visualizza il messaggio
    Poi l'interfaccia iterable, la posso utilizzare all'interno di una classe senza aver implementato l'interfaccia iterator?
    Certo, perché stai sfruttando e restituendo il Iterator del ArrayList.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di el92
    Registrato dal
    Dec 2014
    Messaggi
    177
    Ciao grazie per la risposta ho tre domande:
    1)se io volessi creare un'istanza di Persona1(che è abstract) all'interno del metodo toString della classe Genitore,come dovrei fare?Perchè usando una referenza del tipo:

    codice:
    Persona1 p;
    Genitore g=new Genitore(String nome,String cognome);
    p=g;
    il compilatore mi segnala un errore.
    2)mi rendo conto che il metodo toString di Genitore è un pò contorto..solo che come faccio ad estrarre il nome e cognome dei figli nell'ArrayList se non usando il metodo get?
    3)l'interfaccia iterator(senza Iterable) deve essere necessariamente usata con le iterfacce(es:ArrayList,List ecc..)?
    Ultima modifica di el92; 13-04-2015 a 20:00

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da el92 Visualizza il messaggio
    1)se io volessi creare un'istanza di Persona1(che è abstract)
    Essendo abstract, non potrai mai creare istanze proprio di Persona1. Ovvero, new Persona1( .... , .... ); non è possibile.

    Quote Originariamente inviata da el92 Visualizza il messaggio
    codice:
    Persona1 p;
    Genitore g=new Genitore(String nome,String cognome);
    p=g;
    Questo dove lo usi? Mi sembra corretto comunque, poiché Genitore è-un Persona1, quindi è assegnabile a 'p'.


    Quote Originariamente inviata da el92 Visualizza il messaggio
    2)mi rendo conto che il metodo toString di Genitore è un pò contorto..solo che come faccio ad estrarre il nome e cognome dei figli nell'ArrayList se non usando il metodo get?
    Il problema non è il get .... sono 2 i problemi:
    - Nel corpo del for viene dichiarata una variabile 't' quando a livello del metodo c'è già una variabile 't'. Questo è illegale ... NON compila proprio.
    - Anche se cambiassi qualcosina, la stringa "il nome dei figli della persona sono" non la dovresti ripetere. Essendo nel for .... non ha molto senso.

    Quote Originariamente inviata da el92 Visualizza il messaggio
    3)l'interfaccia iterator(senza Iterable) deve essere necessariamente usata con le iterfacce(es:ArrayList,List ecc..)?
    Iterator è una interfaccia, descrive solo in modo astratto i metodi che ci devono essere per poter iterare e cioè enumerare "qualcosa".
    Chiunque può implementarla/usarla, anche in contesti differenti più lontani dal Collections Framework.
    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 L'avatar di el92
    Registrato dal
    Dec 2014
    Messaggi
    177
    ciao alla fine ho risolto modificando tutto come dicevi tu e cancellando il metodo toString() dalla classe Genitore ed usando nel main il metodo iterator().

    codice:
    class Test{
    public static void main(String[] args){
    
    Genitore p=new Genitore("elena","rossi");
    Genitore p1=new Genitore("alessio","rossini");
    Persona1 g;
    g=p1;
    System.out.println(p.toString());
    p.addFiglio(g);
    Iterator <Persona1> it=p.iterator();
    for(Persona1 c:p){
        System.out.println("suo figlio è: "+"\n"+c);
    }
    }
    }
    Da terminale mi stampa:
    il nome della persona è: elena
    il cognome della persona è: rossi
    suo figlio è:
    il nome della persona è: alessio
    il cognome della persona è: rossini

    Perchè dopo la stringa "suo figlio è: " mi stampa ancora "il nome della persona e:....." ed "il cognome della persona è:",visto che alla variabile c di tipo Persona1 non ho invocato il metodo to String() della classe Persona1?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da el92
    codice:
    Persona1 p;
    Genitore g=new Genitore(String nome,String cognome);
    p=g;
    Mi correggo, è sbagliato!! Non avevo ben notato i due String. Qui devi passare "argomenti" (valori) al costruttore ... non dichiarare i parametri! Non fare questi erroracci.

    Quote Originariamente inviata da el92 Visualizza il messaggio
    ciao alla fine ho risolto modificando tutto come dicevi tu e cancellando il metodo toString() dalla classe Genitore
    Il toString() in Genitore non sarebbe male o sbagliato in sé .... è che prima come l'avevi fatto non era assolutamente corretto (e nemmeno compilava).

    Quote Originariamente inviata da el92 Visualizza il messaggio
    ed usando nel main il metodo iterator().
    Nel tuo ultimo codice, il

    Iterator <Persona1> it=p.iterator();

    è totalmente inutile, perché non lo stai usando. Il "for-each" for(Persona1 c : p) usa già implicitamente un Iterator di nascosto.
    Iterable è stato introdotto proprio per poter essere il "target" del for-each in modo che qualunque oggetto che implementa Iterable possa essere usato con il for-each.

    Quote Originariamente inviata da el92
    Perchè dopo la stringa "suo figlio è: " mi stampa ancora "il nome della persona e:....." ed "il cognome della persona è:",visto che alla variabile c di tipo Persona1 non ho invocato il metodo to String() della classe Persona1?
    La concatenazione di c con la stringa fa invocare implicitamente il toString() su c
    Ultima modifica di andbin; 14-04-2015 a 08:59
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it L'avatar di el92
    Registrato dal
    Dec 2014
    Messaggi
    177
    ciao ma non c'è un modo per non far invocare implicitamente il toString() su c?oppure devo per forza cambiare metodo di suluzione?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da el92 Visualizza il messaggio
    ciao ma non c'è un modo per non far invocare implicitamente il toString() su c?oppure devo per forza cambiare metodo di suluzione?
    La concatenazione di stringa + oggetto fa invocare toString() sull'oggetto .... è così. Non lo puoi cambiare, è a livello di sintassi/compilatore Java.

    Se vuoi comporre in altro modo ... beh, ovviamente si può fare. Prendi i campi (meglio da metodi getter, se li hai messi!) singolarmente e concatena quelli.
    Ancora meglio, definisci in Persona1 un metodo es. getNominativo() che restituisce nome spazio cognome, così puoi fare:

    System.out.println("suo figlio è: " + c.getNominativo());
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it L'avatar di el92
    Registrato dal
    Dec 2014
    Messaggi
    177
    Ciao grazie 1000 per le risposte e per la pazienza sei stato molto gentile

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.