Due oggetti uguali

di il
15 risposte

Due oggetti uguali

Ciao!
Devo vedere se due date sono uguali, come si fa?

nel main inserisco
if (data1.uguali(data2)) {
                        JOptionPane.showMessageDialog(null, "Le date inserite sono uguali");
                    } else {
                        JOptionPane.showMessageDialog(null, "Le date inserite NON sono uguali");
                    }
nella classe "Data" inserisco questo
public boolean uguali(Data data2) {

        boolean b = this.equals(data2);
        return b;
    }


ma mi dice che le date sono diverse (sono uguali)




so che potrei fare così: boolean b = this.giorno==data2.giorno&&this.mese==data2.mese&&this.annno==data2.anno

ma ... vorrei un metodo più semplice insomma.
Aiutini? ?.?

15 Risposte

  • Re: Due oggetti uguali

    cherry ha scritto:


    Devo vedere se due date sono uguali, come si fa?

    nella classe "Data" inserisco questo
    public boolean uguali(Data data2) {
    
            boolean b = this.equals(data2);
            return b;
        }
    Visto che la classe Data è una tua classe ... hai ridefinito il metodo equals?

    public boolean equals(Object altroOggetto)

    Devi farlo, altrimenti rimane quello ereditato da Object, che si basa solo sulla identità degli oggetti (==).

    P.S. non servirebbe nemmeno un metodo "uguali" in più ... c'è equals appunto.
  • Re: Due oggetti uguali

    Scusa non so che significhi "hai ridefinito il metodo equals?"
    ridefinito?
  • Re: Due oggetti uguali

    -----------------------------------
    poi ho fatto anche questo per vedere se una data viene prima dell'altra, ma come al solito mi sembra troppo lungo ... aiutino anche qui?

    public boolean prima(Data data2) {
    
            boolean b = (!this.uguali(data2))
                    && (this.anno < data2.anno || (this.anno == data2.anno && this.mese < data2.mese)
                    || (this.anno == data2.anno && this.mese == data2.mese && this.giorno < data2.giorno));
    
            return b;
        }
  • Re: Due oggetti uguali

    Trovare la differenza tra date inserite.
    public int differenzaDate(Data a) {
            int n = 0;
            Data ccc = new Data(26, 10, 2014);
    
            if (this.prima(a)) {
                ccc.giorno = this.giorno;
                ccc.mese = this.mese;
                ccc.anno = this.anno;
                n = -this.giorno;
                n += a.giorno;
    
                while (ccc.mese != a.mese && ccc.anno != a.anno) {
                    n += giorni(ccc.mese, ccc.anno);
                    ccc.mese++;
                    if (ccc.mese > 12) {
                        ccc.mese = 1;
                        ccc.anno++;
                    }
                }
    
            } else {
                ccc.giorno = a.giorno;
                ccc.mese = a.mese;
                ccc.anno = a.anno;
                n = -a.giorno;
                n += this.giorno;
    
                while (ccc.mese != this.mese && ccc.anno != this.anno) {
                    n += giorni(ccc.mese, ccc.anno);
                    ccc.mese++;
                    if (ccc.mese > 12) {
                        ccc.mese = 1;
                        ccc.anno++;
                    }
                }
    
            }
    
            return n;
    
        }
    


    C'è un modo per farlo meglio? sembra lungo
  • Re: Due oggetti uguali

    Questo è quello che ho fatto ma continua ad essere sbagliato >-<

    public int differenzaDate(Data a) {
            int n = 0;
            Data ccc = new Data(26, 10, 2014);
    
            if (this.prima(a)) {
                ccc.mese = this.mese;
                ccc.anno = this.anno;
                n = a.giorno - this.giorno;
    
                while (ccc.mese != a.mese || ccc.anno != a.anno) {
                    n += giorni(ccc.mese, ccc.anno);
                    ccc.mese++;
                    if (ccc.mese > 12) {
                        ccc.mese = 1;
                        ccc.anno++;
                    }
                }
    
            } else {
                ccc.mese = a.mese;
                ccc.anno = a.anno;
                n = this.giorno - a.giorno;
    
                while (ccc.mese != this.mese || ccc.anno != this.anno) {
                    n += giorni(ccc.mese, ccc.anno);
                    ccc.mese++;
                    if (ccc.mese > 12) {
                        ccc.mese = 1;
                        ccc.anno++;
                    }
                }
    
            }
    
            return n;
    
        }
  • Re: Due oggetti uguali

    cherry ha scritto:


    scusa non so che significhi "hai ridefinito il metodo equals?"
    ridefinito?
    Significa che nella tua classe devi definire un metodo con questa "firma":

    public boolean equals(Object altroOggetto)

    (ovviamente i nomi di parametri sono cambiabili)

    E implementarlo per comparare lo "stato" dell'oggetto this con lo "stato" dell'altro oggetto passato e dire se i due oggetti sono di contenuto "uguale".
    Il parametro deve essere Object. Generalmente/tipicamente si fa un test con l'operatore instanceOf per verificare se l'oggetto IS-A ("è-un") TuoTipo (la tua classe).

    Personalmente, ti consiglio di apprendere quanto prima possibile i concetti di override e overload .... senza di questi ti assicuro che non vai molto "lontano" in Java.

    cherry ha scritto:


    poi ho fatto anche questo per vedere se una data viene prima dell'altra, ma come al solito mi sembra troppo lungo ... aiutino anche qui?
    L'uso del tuo metodo 'uguali' non serve granché, puoi toglierlo .... fai già i confronti sui campi.
    Lungo comunque non lo è (è assolutamente accettabile) ... insomma, il concetto è quello ed è corretto. Se vuoi puoi raggruppare il this.anno == data2.anno (noti che lo fai 2 volte?).
    Ma comunque il "succo" è quello.

    cherry ha scritto:


    trovare la differenza tra date inserite.

    C'è un modo per farlo meglio? sembra lungo
    Non ho molto tempo ora per valutare bene il tuo codice ma una cosa posso dirtela subito. Invece di sdoppiare la logica per i due casi, fai in modo da avere 2 variabili in cui tenere i due oggetti e nell'ordine corretto che serve per l'algoritmo.
    Io, ancora meglio, farei un metodo privato e statico che riceve 2 oggetti Data e fa la differenza. Poi nel tuo 'differenzaDate' di istanza, se this < data2, passo a quel metodo this, data2, altrimenti passo data2, this.
    Semplice, no?
  • Re: Due oggetti uguali

    TI RINGRAZIO DAVVERO MOLTO! Sempre disponibile e gentile :D:D
    Oggi darò al prof quello che ho fatto e lo guarderà a casa. ?



    mi è venuta in mente un'altra cosa! Ricordo che c'era un modo per accorciare gli if tipo così, l'ho visto in un tutorial, ma non capisco dove sbaglio:
    JOptionPane.showMessageDialog(null, (numero>1) "il numero inserito è maggior di uno": "il numero "
            + "inserito non è maggiore di uno");
    al posto che così :
    if(numero>1){
                JOptionPane.showMessageDialog(null, "il numero inserito è maggior di uno");
            }
            else{
                JOptionPane.showMessageDialog(null, "il numero inserito non è maggior di uno");
            }

    magari qualcuno sa anche questo?
  • Re: Due oggetti uguali

    cherry ha scritto:


    TI RINGRAZIO DAVVERO MOLTO! Sempre disponibile e gentile :D:D
    Oggi darò al prof quello che ho fatto e lo guarderà a casa. ?
    Prego.

    cherry ha scritto:


    JOptionPane.showMessageDialog(null, (numero>1) "il numero inserito è maggior di uno": "il numero "
            + "inserito non è maggiore di uno");
    L'operatore "condizionale" ha la forma condizioneBoolean ? valoreSeTrue : valoreSeFalse

    Quindi ti basta mettere un ? dopo la condizione.
  • Re: Due oggetti uguali

    Ho fatto questo esercizio, ma la riga dove c'è questo dice che è sbagliata facendo run, come mai?



    alunno.setNome(JOptionPane.showInputDialog("Come si chiama il/la " + (i + 1) + "° alunno/a?"));


    codice completo:
    package gestionepersona2;
    
    import javax.swing.JOptionPane;
    
    public class GestionePersona2 {
    
        public static void main(String[] args) {
            String o = "1 ) Cambia data odierna\n\n\nVisualizza i dati di ... \n\n";
            int gg = 0;
            int mm = 0;
            int aaaa = 0;
            String risultato;
    
            int massimo = Integer.parseInt(JOptionPane.showInputDialog("Quanti alunni ci sono?"));
            Persona alunno[] = new Persona[massimo];
    
            int i = 0;
            while (i < alunno.length) {
                alunno[i].setNome(JOptionPane.showInputDialog("Come si chiama il/la " + (i + 1) + "° alunno/a?"));
                alunno[i].setCognome(JOptionPane.showInputDialog("Come si chiama il "
                        + alunno[i].getCognome() + " di cognome?"));
                alunno[i].setGiornoDiNascita(Integer.parseInt(JOptionPane.showInputDialog("In che giorno è nato/a?")));
                alunno[i].setGiornoDiNascita(Integer.parseInt(JOptionPane.showInputDialog("In che mese?")));
                alunno[i].setGiornoDiNascita(Integer.parseInt(JOptionPane.showInputDialog("In che anno?")));
                o += i + 2 + " ) " + alunno[i].getNome() + " " + alunno[i++].getCognome() + "\n";
            }
            o += i + 2 + " ) Esci";
            i = 1;
    
            while (i < alunno.length + 2) {
                if (i == 1) {
                    gg = Integer.parseInt(JOptionPane.showInputDialog("Che giorno è oggi?"));
                    mm = Integer.parseInt(JOptionPane.showInputDialog("Che mese?"));
                    aaaa = Integer.parseInt(JOptionPane.showInputDialog("Che anno?"));
                }
    
                i = Integer.parseInt(JOptionPane.showInputDialog(o));
    
                if (alunno[i].etàLavorativa(gg, mm, aaaa)) {
                    risultato = " ed è quindi in età lavorativa.";
                
                }
                else{
                    risultato = " e quindi NON è in età lavorativa.";
                }
                System.out.println(alunno[i].getNome() + " " + alunno[i].getCognome() + " ha "
                        + alunno[i].etàPersona(gg, mm, aaaa) + " anni, "
                        + risultato + "\n\nGiorno\tMese\tAnno\n" + alunno[i].getGiornoDiNascita() + "\t"
                        + alunno[i].getMeseDiNascita() + "\t" + alunno[i].getAnnoDiNascita());
    
            }
    
        }
    
    }
    



    codice della classe

    package gestionepersona2;
    
    public class Persona {
    
        private String nome;
        private String cognome;
        private int giornoDiNascita;
        private int meseDiNascita;
        private int annoDiNascita;
    
        public Persona(String nome, String cognome, int giornoDiNascita, int meseDiNascita, int annoDiNascita) {
            this.nome = nome;
            this.cognome = cognome;
            this.giornoDiNascita = giornoDiNascita;
            this.meseDiNascita = meseDiNascita;
            this.annoDiNascita = annoDiNascita;
        }
    
        public String getNome() {
            return nome;
        }
    
        public void setNome(String nome) {
            this.nome = nome;
        }
    
        public String getCognome() {
            return cognome;
        }
    
        public void setCognome(String cognome) {
            this.cognome = cognome;
        }
    
        public int getGiornoDiNascita() {
            return giornoDiNascita;
        }
    
        public void setGiornoDiNascita(int giornoDiNascita) {
            this.giornoDiNascita = giornoDiNascita;
        }
    
        public int getMeseDiNascita() {
            return meseDiNascita;
        }
    
        public void setMeseDiNascita(int meseDiNascita) {
            this.meseDiNascita = meseDiNascita;
        }
    
        public int getAnnoDiNascita() {
            return annoDiNascita;
        }
    
        public void setAnnoDiNascita(int annoDiNascita) {
            this.annoDiNascita = annoDiNascita;
        }
    
        public int etàPersona(int giornoAttuale, int meseAttuale, int annoAttuale) {
    
            int anniPersona = 0;
            if (meseAttuale < getMeseDiNascita()) {
                anniPersona = annoAttuale - getAnnoDiNascita() - 1;
            } else if (meseAttuale == getMeseDiNascita()) {
    
                if (giornoAttuale < getGiornoDiNascita()) {
    
                } else {
                    anniPersona = annoAttuale - getAnnoDiNascita();
                }
            } else {
                anniPersona = annoAttuale - getAnnoDiNascita();
            }
            return anniPersona;
        }
    
        public boolean etàLavorativa(int giornoAttuale, int meseAttuale, int annoAttuale) {
            boolean etàLavorativa = false;
            int anniPersona = 0;
            anniPersona = etàPersona(giornoAttuale, meseAttuale, annoAttuale);
            if (anniPersona > 16 && anniPersona < 70) {
                etàLavorativa = true;
            }
            return etàLavorativa;
    
        }
    
    }
    


    Sapreste aiutarmi anche qui? alla fine non dovete guardare tutto il codice ma solo quello che vi ho detto ... Grazie in anticipo e grazie anche per il resto, anche se non ho molto capito tutto
  • Re: Due oggetti uguali

    cherry ha scritto:


    Ho fatto questo esercizio, ma la riga dove c'è questo dice che è sbagliata facendo run, come mai?

    alunno.setNome(JOptionPane.showInputDialog("Come si chiama il/la " + (i + 1) + "° alunno/a?"));

    La riga in sé è corretta (sia sintatticamente sia come significato). Il problema è un altro.
    Hai istanziato un array di tipo Persona[]:

    Persona alunno[] = new Persona[massimo];

    Questo istanzia l'array (che è un oggetto) ... NON istanzia gli oggetti Persona! Dopo che hai istanziato l'array in quel modo, esso contiene solo reference null.
    Ovviamente alunno si risolve in un null e invocarci metodi causa NullPointerException.

    Soluzione: ad ogni ciclo devi istanziare tu un oggetto Persona ed assegnarlo all'elemento dell'array.
  • Re: Due oggetti uguali

    Grazie della risposta, ma non ho capito. Lo farò leggere al profe
  • Re: Due oggetti uguali

    cherry ha scritto:


    grazie della risposta, ma non ho capito. Lo farò leggere al profe
    Se si vuole avere un array che contiene 3 oggetti Persona, così è un modo corretto:
    Persona[] persone = new Persona[3];
    persone[0] = new Persona();
    persone[1] = new Persona();
    persone[2] = new Persona();
    Solo dopo che un elemento dell'array fa riferimento ad un oggetto Persona, allora puoi fare persone[indice].setNome( .... );

    Il "new Persona[3]" istanzia solo l'array, ripeto, non i singoli oggetti Persona.
  • Re: Due oggetti uguali

    Grazie mille. Adesso mi da errore qui:

    + alunno.getNome()

    package gestionepersona2;
    
    import javax.swing.JOptionPane;
    
    public class GestionePersona2 {
    
        public static void main(String[] args) {
            String o = "1 ) Cambia data odierna\n\n\nVisualizza i dati di ... \n\n";
            int gg = 0;
            int mm = 0;
            int aaaa = 0;
            String risultato;
    
            int massimo = Integer.parseInt(JOptionPane.showInputDialog("Quanti alunni ci sono?"));
            Persona alunno[] = new Persona[massimo];
    
            int i = 0;
            while (i < alunno.length) {
                alunno[i] = new Persona(JOptionPane.showInputDialog("Come si chiama il/la " + (i + 1) + "° alunno/a?"),
                        JOptionPane.showInputDialog("Come si chiama il "
                                + alunno[i].getNome()+ " di cognome?"),
                        Integer.parseInt(JOptionPane.showInputDialog("In che giorno è nato/a?")),
                        Integer.parseInt(JOptionPane.showInputDialog("In che mese?")),
                        Integer.parseInt(JOptionPane.showInputDialog("In che anno?")));
    
                o += i + 2 + " ) " + alunno[i].getNome() + " " + alunno[i++].getCognome() + "\n";
            }
            o += i + 2 + " ) Esci";
            i = 1;
    
            while (i < alunno.length + 2) {
                if (i == 1) {
                    gg = Integer.parseInt(JOptionPane.showInputDialog("Che giorno è oggi?"));
                    mm = Integer.parseInt(JOptionPane.showInputDialog("Che mese?"));
                    aaaa = Integer.parseInt(JOptionPane.showInputDialog("Che anno?"));
                }
    
                i = Integer.parseInt(JOptionPane.showInputDialog(o));
    
                if (alunno[i].etàLavorativa(gg, mm, aaaa)) {
                    risultato = " ed è quindi in età lavorativa.";
    
                } else {
                    risultato = " e quindi NON è in età lavorativa.";
                }
                System.out.println(alunno[i].getNome() + " " + alunno[i].getCognome() + " ha "
                        + alunno[i].etàPersona(gg, mm, aaaa) + " anni, "
                        + risultato + "\n\nGiorno\tMese\tAnno\n" + alunno[i].getGiornoDiNascita() + "\t"
                        + alunno[i].getMeseDiNascita() + "\t" + alunno[i].getAnnoDiNascita());
    
            }
    
        }
    
    }
    
  • Re: Due oggetti uguali

    cherry ha scritto:


    + alunno.getNome()
                alunno[i] = new Persona(JOptionPane.showInputDialog("Come si chiama il/la " + (i + 1) + "° alunno/a?"),
                        JOptionPane.showInputDialog("Come si chiama il "
                                + alunno[i].getNome()+ " di cognome?"),
                        Integer.parseInt(JOptionPane.showInputDialog("In che giorno è nato/a?")),
                        Integer.parseInt(JOptionPane.showInputDialog("In che mese?")),
                        Integer.parseInt(JOptionPane.showInputDialog("In che anno?")));
    Perché alunno.getNome() viene invocato PRIMA che l'oggetto Persona venga creato e assegnato a alunno !! Così non può funzionare. Tra l'altro una espressione così lunga, complessa e con tante invocazioni di metodi è poco chiara e difficile da leggere.

    Cerca di abituarti a separare meglio le cose. Dato che fai più volte l'input per ottenere stringhe e numeri, allora pensa alla creazione di metodi appositi per ottenere String e int, tipo:

    public static String readString(String message) {  ....  }
    public static int readInt(String message) {  ....  }
    Poi nel while fai:
    String nome = readString("Come si chiama ........ ");
    String cognome = readString(" ....... ");
    int giorno = readInt(" ...... ");
    ......
    alunno[i] = new Persona(nome, cognome, ......... );
    L'ho abbozzato, ovviamente. Ma diventa chiaro, pulito, leggibile e inequivocabile.
    E sarebbe ancora meglio se facessi una classe a parte apposita per i metodi di input ma sarebbe ovviamente qualcosa di più che non so se ti è stato richiesto e/o sai/vuoi fare.
Devi accedere o registrarti per scrivere nel forum
15 risposte