Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    14

    [Java] Usare il metodo Contains() in un'arraylist di oggetti

    Ciao a tutti!!!

    Allora ho un arraylist di oggetti FileParole, ogni oggetto è composto da 2 stringhe (parola e file)


    codice:
    ArrayList<FileParole> dati = new ArrayList<FileParole>()
    prendo semplicemente da scanner le mie due stringe da inserire nell'arraylist, ma prima vorrei fare un controllo se per caso ci sia già lo stesso oggetto (con la stessa stringa "parola" e "file")
    codice:
    FileParole file = new FileParole(line, inFile);
    if(dati.contains(file)){
    ...
    }
    else{
    dati.add(file);}
    perchè non funziona? Grazie a tutti ;-)

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: [Java] Usare il metodo Contains() in un'arraylist di oggetti

    La tua implementazione di FileParole ridefinisce equals?
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    14

    Re: Re: [Java] Usare il metodo Contains() in un'arraylist di oggetti

    Originariamente inviato da Alex'87
    La tua implementazione di FileParole ridefinisce equals?
    No...ecco cosa mi mancava...cosa dovrei fare esattamente?

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: Re: Re: [Java] Usare il metodo Contains() in un'arraylist di oggetti

    Originariamente inviato da cavo89
    No...ecco cosa mi mancava...cosa dovrei fare esattamente?
    Tutti le classi ereditano da Object il metodo public boolean equals(Object). Tale metodo viene usato per confrontare internamente due oggetti tra loro (ricorda che usando == non confronti il contenuto di due oggetti ma solo il loro riferimento). Se equals non viene ridefinito eredita il comportamento presente in Object che nel 99.9% dei casi non è quello che serve.

    In pratica devi aggiungere il metodo equals rispettandone la firma. Nel corpo dovrai inserire le istruzioni che effettuano il confronto. Esempio:

    codice:
    public class Persona {
      private String nome;
      private String cognome;
    
      ...
      ...
    
      public boolean equals(Object obj) {
        if (obj == null) {
          return false;
        }
    
        if (!(obj instanceof Persona)) {
          return false; 
        } 
    
        Persona p = (Persona) obj;
        return p.nome.equals(this.nome) && p.cognome.equals(this.cognome);
      }
    }
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    14

    Re: Re: Re: Re: [Java] Usare il metodo Contains() in un'arraylist di oggetti

    Originariamente inviato da Alex'87
    Tutti le classi ereditano da Object il metodo public boolean equals(Object). Tale metodo viene usato per confrontare internamente due oggetti tra loro (ricorda che usando == non confronti il contenuto di due oggetti ma solo il loro riferimento). Se equals non viene ridefinito eredita il comportamento presente in Object che nel 99.9% dei casi non è quello che serve.

    In pratica devi aggiungere il metodo equals rispettandone la firma. Nel corpo dovrai inserire le istruzioni che effettuano il confronto. Esempio:

    codice:
    public class Persona {
      private String nome;
      private String cognome;
    
      ...
      ...
    
      public boolean equals(Object obj) {
        if (obj == null) {
          return false;
        }
    
        if (!(obj instanceof Persona)) {
          return false; 
        } 
    
        Persona p = (Persona) obj;
        return p.nome.equals(this.nome) && p.cognome.equals(this.cognome);
      }
    }

    Grazie mille !!! Davvero gentilissimo.
    Quindi in teoria potrei fare anche un contains "parziale" ? Cioè se inserisco un'ulteriore parametro all'oggetto (per esempio numTelefono) e lasciassi invariata la ridefinizione di equals, verrebbero considerate uguali anche gli oggetti con nome e cognome uguali ma con NumTelefono diverso?

  6. #6

    Re: Re: Re: Re: Re: [Java] Usare il metodo Contains() in un'arraylist di oggetti

    Originariamente inviato da cavo89
    Quindi in teoria potrei fare anche un contains "parziale"?
    Non ridefinisci il contains...ma il metodo equals.
    Originariamente inviato da cavo89
    Cioè se inserisco un'ulteriore parametro all'oggetto (per esempio numTelefono) e lasciassi invariata la ridefinizione di equals, verrebbero considerate uguali anche gli oggetti con nome e cognome uguali ma con NumTelefono diverso?
    Se ti riferisci all'esempio di Alex, la risposta è si. E comunque ti conviene ridefinire anche hashCode, in quanto avere due oggetti uguali con diverso hash non è corretto.

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    14
    Grazie mille a tutti !!! Veramente...so che posso sempre contare su di voi in casi di emergenza

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.