Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110

    Comparare due stringhe di istanze diverse

    Ho creato una classe che istanzia una rubrica. Funziona tutto, get & set compresi.
    Ora, voglio fare un check tra due campi di istanze diverse... come fare?

    Ho provato come metodo della classe main che va a creare e a invocare le istanze ma mi da errore all'invocazione del metodo sonoUguali avvisandomi che il metodo è indefinito per il tipo IndirizzoPersonaDemo pur avendolo comunque impostato ad inizio classe. Dove sbaglio?

    codice:
    import java.util.Scanner;
    
    
    public class IndirizzoPersona {
    
    
        private String nome;
        private String cognome;
        private String email;
        private String telefono;
        
        
        public void setNome(String nuovonome){
            nome = nuovonome;
        }
        
        public void setCognome(String nuovocognome){
            cognome = nuovocognome;
        }
        
        public void setEmail(String nuovaemail){
            email = nuovaemail;
        }
    
    
        public void setTelefono(String nuovotelefono){
            telefono = nuovotelefono;
        }
        
        public String getNome(){
            return nome;
        }
        
        public String getCognome(){
            return cognome;
        }
        
        public String getEmail(){
            return email;
        }
        
        public String getTelefono(){
            return telefono;
        }
        
        
    }

    classe con main e metodo sonoUguali:

    codice:
    import java.util.Scanner;
    
    
    public class IndirizzoPersonaDemo {
    
    
        public void static sonoUguali (String s1, String s2){
            boolean check = s1.equals(s2);
                if (check)
                {
                    System.out.println("Sono uguali!");
                }
                else
                {
                    System.out.println("NON sono uguali!");
                }
            }
        
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
    
            IndirizzoPersona mariorossi = new IndirizzoPersona();
            IndirizzoPersona rossimario = new IndirizzoPersona();
        
            pietrosette.setNome("Mario");
            pietrosette.setCognome("Rossi");
            pietrosette.setEmail("mariorossi@abc.it");
            pietrosette.setTelefono("12345678");
            
            System.out.println("Il nome è: " + mariorossi.getNome());
            System.out.println("Il cognome è: " + mariorossi.getCognome());
            System.out.println("La mail è: " + mariorossi.getEmail());
            System.out.println("Il telefono è: " + mariorossi.getTelefono());
        
            rossimario.setNome("Mario");
            rossimario.setCognome("Rossi");
            rossimario.setEmail("mariorossi@abc.it");
            rossimario.setTelefono("12345678");
            
                
            sonoUguali(mariorossi.getNome(), rossimario.getNome());
            
            
        }
    
    
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    Ho provato come metodo della classe main che va a creare e a invocare le istanze ma mi da errore all'invocazione del metodo sonoUguali avvisandomi che il metodo è indefinito per il tipo IndirizzoPersonaDemo pur avendolo comunque impostato ad inizio classe. Dove sbaglio?
    Posta sempre l'errore che ottieni !! Anche perché provandolo a interpretare rischi solo di confondere te e chi legge ...

    codice:
    IndirizzoPersonaDemo.java:7: error: <identifier> expected
    Questo non vuol dire che il metodo non è stato definito. Quell'errore è in genere causato dal fatto che il codice è mal formato, può capitare se inserisci del codice fuori da un metodo, se sbagli a dichiarare metodi o variabili, forse anche in altri casi.
    Nel tuo caso l'errore è che hai invertito void e static nella dichiarazione del metodo sonoUguali, devi dichiararlo come public static void

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    Ho creato una classe che istanzia una rubrica. Funziona tutto, get & set compresi.
    Ora, voglio fare un check tra due campi di istanze diverse... come fare?
    In ogni caso non hai bisogno di quel metodo sonoUguali, per testare l'uguaglianza di due stringhe ti basta fare stringa1.equals(stringa2). Ovviamente puoi scambiare l'ordine delle stringhe e fare anche il contrario a meno che la prima stringa non sia NULL, nel qual caso l'istruzione lancierà una NullPointerException, perché non puoi invocare un metodo su un oggetto NULL (vale ovviamente in entrambi i casi, è solo per dire che le due scritture non sono sempre equivalenti, perché se è la seconda stringa a essere null il metodo non causa errori, anche se magari sarebbe meglio lo facesse ...).

    Piccola curiosità: che senso ha chiamare la tua classe IndirizzoPersona, se modella il contatto di una rubrica? Non è meglio avere una classe Contatto ? La classe potrebbe anche prevedere uno o più costruttori, in modo da evitare di richiamare tutti i set al momento della creazione, e sarebbe comodo avere anche un metodo toString(), visto che cerchi di stampare a video tutti i campi. Quest' ultimo dettaglio puoi rimandarlo a più avanti se non l'hai ancora visto chiaramente, ma male non fa guardarsi subito come funziona
    Ultima modifica di Ansharja; 21-12-2016 a 20:27

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    In ogni caso non hai bisogno di quel metodo sonoUguali, per testare l'uguaglianza di due stringhe ti basta fare stringa1.equals(stringa2). Ovviamente puoi scambiare l'ordine delle stringhe e fare anche il contrario a meno che la prima stringa non sia NULL, nel qual caso l'istruzione lancierà una NullPointerException, perché non puoi invocare un metodo su un oggetto NULL (vale ovviamente in entrambi i casi, è solo per dire che le due scritture non sono sempre equivalenti, perché se è la seconda stringa a essere null il metodo non causa errori, anche se magari sarebbe meglio lo facesse ...).
    Ma è quello che ho fatto all'interno del metodo solo che s1 e s2 sono due entità di due istanze diverse...

    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Piccola curiosità: che senso ha chiamare la tua classe IndirizzoPersona, se modella il contatto di una rubrica? Non è meglio avere una classe Contatto ? La classe potrebbe anche prevedere uno o più costruttori, in modo da evitare di richiamare tutti i set al momento della creazione, e sarebbe comodo avere anche un metodo toString(), visto che cerchi di stampare a video tutti i campi. Quest' ultimo dettaglio puoi rimandarlo a più avanti se non l'hai ancora visto chiaramente, ma male non fa guardarsi subito come funziona
    hai ragione... l'ho chiamata così solo perché me lo richiedeva l'esercizio ma indubbiamente Contatto è il nome migliore. In che senso più costruttori per evitare di richiamare tutti i set? toString() ancora non l'ho studiato ma mo ci do uno sguardo

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    In che senso più costruttori per evitare di richiamare tutti i set?
    Es. Un costruttore per impostare nome+cognome, un altro costruttore per impostare nome+cognome+email, un altro ancora che riceve e imposta nome+cognome+email+telefono.
    Avere più costruttori in cui ognuno aumenta di un (tipicamente) parametro si definiscono informalmente costruttori "telescopici". Se sono pochi è un conto ma generalmente è bene non abusarne.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    Ma è quello che ho fatto all'interno del metodo solo che s1 e s2 sono due entità di due istanze diverse...

    Sì ma il passaggio attraverso il metodo è superfluo, a meno che tu non voglia fare qualcosa in più oltre al semplice confronto e voglia richiamare più volte il metodo.
    Il fatto che s1 e s2 siano campi di due istanze diverse non vuol dire nulla! Se hai le istanze sotto mano puoi confrontarle in qualsiasi punto, puoi benissimo fare ad esempio :


    codice:
    if(marioRossi.getNome().equals(rossimario.getNome())) {
      // fai quello che devi fare ...
    }
    Se il problema è un altro specifica meglio ma ripeto, una volta che hai le stringhe da confrontare non ha alcuna importanza il fatto che siano di un'istanza o un'altra, create localmente al metodo, variabili statiche o altro.

    In ogni caso se l'idea era di scrivere un metodo per determinare quando due contatti siano uguali, il metodo migliore sarebbe ridefinire equals all'interno di IndirizzoPersona, datti un'occhiata anche a questo se la cosa ti interessa


    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    In che senso più costruttori per evitare di richiamare tutti i set?
    Al momento stai utilizzando un costruttore vuoto (quello definito implicitamente) per creare un contatto, e poi stai settando manualmente ogni campo. Questa parte sarebbe molto più veloce se prevedessi un costruttore con 4 argomenti in cui setti all'interno i campi, potendo creare un contatto in questo modo :

    codice:
    new IndirizzoPersona ("Mario", "Rossi", "email", 12345);
    Il fatto che i costruttori siano uno o più cambia poco, se vuoi poter creare un contatto con meno informazioni può essere utile, per i parametri mancanti puoi settare un valore di default (in questo caso non ha molto senso), o semplicemente lasciarli vuoti.

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110
    Ora provo a fare un costruttore a quattro argomenti!
    Ma in che senso definire equals all'interno di IndirizzoPersona? Spostare il metodo già fatto la' dentro?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    Ma in che senso definire equals all'interno di IndirizzoPersona?
    Il equals() serve per stabilire se due oggetti sono di contenuto/significato "equivalente". Ridefinire il public boolean equals(Object) in una classe permette quindi di verificare in modo generalizzato se due oggetti di quella classe hanno contenuto/significato "equivalente". Se non si ridefinisce equals, resta quello "ereditato" da Object, che si basa SOLO sulla identità degli oggetti e NON sul loro contenuto. Chiaramente devi stabilire tu COSA confrontare cioè in che cosa due oggetti sono da ritenere "equivalenti".

    E detto in generale, se si ridefinisce equals() si dovrebbe anche ridefinire hashCode(), perché tra i due c'è un contratto ben preciso.
    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
    Registrato dal
    Aug 2016
    Messaggi
    110
    Comunque avevo impostato il set manuale di ogni campo per prevedere un eventuale richiesta di inserimento/modifica all'utente tramite System.out.println()

  10. #10
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Il equals() serve per stabilire se due oggetti sono di contenuto/significato "equivalente". Ridefinire il public boolean equals(Object) in una classe permette quindi di verificare in modo generalizzato se due oggetti di quella classe hanno contenuto/significato "equivalente". Se non si ridefinisce equals, resta quello "ereditato" da Object, che si basa SOLO sulla identità degli oggetti e NON sul loro contenuto. Chiaramente devi stabilire tu COSA confrontare cioè in che cosa due oggetti sono da ritenere "equivalenti".

    E detto in generale, se si ridefinisce equals() si dovrebbe anche ridefinire hashCode(), perché tra i due c'è un contratto ben preciso.
    Perdonami, non ho capito la differenza... entrambi, in questo caso, non controllano che i "nome" di entrambe le istanze coincidano? Non ho capito la differenza tra identità e contenuto...

    hashCode() non l'ho ancora studiato... vado a vedere!

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.