Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [JAVA] HashSet

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2015
    Messaggi
    37

    [JAVA] HashSet

    codice:
    public static void main(String[] args) {		Set<Cliente> lista=new HashSet<Cliente>();
    		
    		Cliente c = new Cliente();
    		c.setNome("andrea");
    		c.setEta(2);
    		
    		Cliente f=new Cliente();
    		f.setEta(2);
    		f.setNome("andrea");
    		lista.add(f);
    		lista.add(c);
    		
    		System.out.println("------Visualizza-----------");
    		Iterator<Cliente> it = lista.iterator();
    		while (it.hasNext()){
    			  Cliente p = it.next();
    			  System.out.println(p);
    			}
    		
    	
    	}
    codice:
    public class Cliente implements Comparable<Cliente>, Comparator<Cliente>{
    
    	private String nome;
    
    
    	
    	
    	public String getNome() {
    		return nome;
    	}
    	public void setNome(String nome) {
    		this.nome = nome;
    	}
    
    
    	@Override
    	public String toString() {
    		// TODO Auto-generated method stub
    		return nome;
    	}
    	
    	@Override
    	public int compareTo(Cliente o) {
                    int i=0;
    		if (o.getNome().equalsIgnoreCase(this.nome)){
                      i=0;
                    }else{
                      i=-1;
                    }
                   return i;
    	}
    	
    		  public int compare(Cliente p1, Cliente p2){
    		    return p1.getNome().compareTo(p2.getNome());
    		  }  
    		
    	
    	public boolean equals(Cliente c) {
    		// TODO Auto-generated method stub
    		boolean chiave = false;
    		if (this.nome.equalsIgnoreCase(c.getNome())) {
    			chiave = true;
    		} else {
    			chiave = false;
    		}
    		return chiave;
    	}
    	
    	public Cliente() {
    		
    	}
    }
    mi trovo alle prime armi. Sto provando ad inserire in una lista HashSet dei clienti, ma quando inserisco due clienti con lo stesso nome vengono inseriti nella lista, come mai?
    due oggetti uguali non li dovrebbe inserire nella lista. cosa sbaglio?

    Grazie

  2. #2
    la butto li.
    forse non hai fatto l'override del metodo equals?

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da iTuring Visualizza il messaggio
    Sto provando ad inserire in una lista HashSet dei clienti, ma quando inserisco due clienti con lo stesso nome vengono inseriti nella lista, come mai?
    due oggetti uguali non li dovrebbe inserire nella lista. cosa sbaglio?
    HashSet si basa sull'utilizzo del contratto tra equals/hashCode degli oggetti. Nel tuo Cliente non hai fatto un override di equals (il parametro deve essere Object!) ... ma un overload, che HashSet non sarebbe in grado di usare.
    E nota: HashSet quindi non si basa su Comparable/Comparator.

    Se ridefinisci correttamente equals(), devi ridefinire correttamente anche hashCode() per rispettare il contratto tra i due metodi. Se violi il contratto .... succedono altre "brutte" cose nel HashSet.


    P.S. Comparator non si implementa di norma nella classe degli oggetti da comparare! Ha generalmente poco senso. I Comparator (se ne possono avere N) si implementano in classi distinte dalla classe dei tuoi oggetti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2015
    Messaggi
    37
    Quote Originariamente inviata da andbin Visualizza il messaggio
    HashSet si basa sull'utilizzo del contratto tra equals/hashCode degli oggetti. Nel tuo Cliente non hai fatto un override di equals (il parametro deve essere Object!) ... ma un overload, che HashSet non sarebbe in grado di usare.
    E nota: HashSet quindi non si basa su Comparable/Comparator.

    Se ridefinisci correttamente equals(), devi ridefinire correttamente anche hashCode() per rispettare il contratto tra i due metodi. Se violi il contratto .... succedono altre "brutte" cose nel HashSet.


    P.S. Comparator non si implementa di norma nella classe degli oggetti da comparare! Ha generalmente poco senso. I Comparator (se ne possono avere N) si implementano in classi distinte dalla classe dei tuoi oggetti.

    Grazie tante ho risolto

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2015
    Messaggi
    37
    ma di quale contratto parli? perchè si utilizza hashCode ?

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quote Originariamente inviata da iTuring Visualizza il messaggio
    ma di quale contratto parli? perchè si utilizza hashCode ?
    Leggi la documentazione dei metodi hashCode() e equals() di Object.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da iTuring Visualizza il messaggio
    ma di quale contratto parli?
    E dopo che hai letto la documentazione che ti ha indicato LeleFT, prova a pensare perché la seguente semplice classe viola il contratto alla grande.

    codice:
    class Persona {
        private final String nome;
    
        public Persona(String nome) {
            this.nome = nome;
        }
    
        // ... getter ... altro ....
    
        public boolean equals(Object o) {
            if (o instanceof Persona) {
                Persona altraPersona = (Persona) o;
                return nome.equals(altraPersona.nome);
            } else {
                return false;
            }
        }
    }
    Quote Originariamente inviata da iTuring Visualizza il messaggio
    perchè si utilizza hashCode ?
    hashCode() viene usato principalmente nelle collezioni basate internamente su una struttura dati hash-table. Nel framework standard, principalmente nelle collezioni: HashMap, HashSet, LinkedHashMap e LinkedHashSet.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.