Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    equals e hashCode in questa classe

    dovrei fare equals e hashcode.
    la classe penso di averla fatta bene ma ho dei dubbi su questi due metodi, sono corretti?
    se non lo sono, doove sbaglio?
    cosa prendere in considerazione con equals?
    codice:
    package agendina;import java.io.*;
    import util.*;
    import string.*;
    import java.util.StringTokenizer;
    
    
    public class AgendinaVector implements Agendina{
    	private Vector<Nominativo> tabella;
    	public AgendinaVector(){this(100);}
    	
    	public AgendinaVector(int n){ //pre: n>0
    		tabella=new ArrayVector<Nominativo>(n);
    	}
    	
    	public int size(){return tabella.size();}
    	
    	public void svuota(){tabella.clear();}
    	
    	public void aggiungi(Nominativo nm){
    		//cerca indice i per inserimento di n in elenco
    		int i=0;
    		while(i<size() && tabella.get(i).compareTo(nm)<0)
    			i++;
    		//in caso esiste, sovrascrive
    		if(i<size() && tabella.get(i).equals(nm)){
    			tabella.set(i,nm);
    			return;
    			//aggiornamento
    		}
    		//inserisci nm
    		tabella.add(i,nm);
    	}
    	public void rimuovi(Nominativo nm){
    		//ricerca nell'elenco
    		int i=Array.ricercaBinaria(tabella,nm);
    		if(i==-1) return;
    		tabella.remove(i);
    	}
    	public Nominativo cerca(Nominativo nm){
    		int i=Array.ricercaBinaria(tabella, nm);
    		if(i==-1) return null;
    		return tabella.get(i);
    	}
    	public Nominativo cerca(String prefisso, String telefono){
    		for(int i=0; i<tabella.size(); i++){
    			Nominativo nm=tabella.get(i);
    			if(nm.getPrefisso().equals(prefisso) && nm.getTelefono().equals(telefono))
    				return nm;
    		}
    		return null;
    	}
    	public String toString(){
    		StringBuilder sb=new StringBuilder(500);
    		for(int i=0; i<tabella.size(); i++)
    			sb.append(tabella.get(i)+"\n");
    		return sb.toString();
    	}
    	
    	public void salva(String nomeFile) throws IOException{
    		PrintWriter pw=new PrintWriter(new FileWriter(nomeFile));
    		for(int i=0; i<tabella.size(); i++)
    			pw.println(tabella.get(i)); //si sfrutta toString nominativo
    		pw.close();
    	}
    	
    	public void ripristina(String nomeFile) throws IOException{
    		tabella.clear();
    		BufferedReader br=new BufferedReader(new FileReader(nomeFile));
    		String linea=null;
    		StringTokenizer st=null;
    		String cog, nom, pre, tel;
    		for(;;){
    			linea=br.readLine();
    			if(linea==null) break;
    			st=new StringTokenizer(linea, "-");
    			cog=st.nextToken();
    			nom=st.nextToken();
    			pre=st.nextToken();
    			tel=st.nextToken();
    			Nominativo n=new Nominativo(cog,nom,pre,tel);
    			this.aggiungi(n);
    		}
    		br.close();
    	}
    	
    	public boolean equals(Object x){
    		if(!(x instanceof AgendinaVector))
    			return false;
    		if(x==this)
    			return true;
    		AgendinaVector av=(AgendinaVector)x;
    		if(this.size()!=av.size())
    			return false;
    		for(int i=0; i<size(); i++)
    			if(tabella.get(i).equals(x))
    				return false;
    		return true;
    	}
    	
    	public int hashCode(){
    		final int MOLT=41;
    		int h=0;
    		for(int i=0; i<size(); i++)
    			h=h*MOLT+tabella.get(i).hashCode();
    		return h;
    	}
    
    
    }
    grazie mille

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da DarkPassenger Visualizza il messaggio
    codice:
    	public boolean equals(Object x){
    		if(!(x instanceof AgendinaVector))
    			return false;
    		if(x==this)
    			return true;
    		AgendinaVector av=(AgendinaVector)x;
    		if(this.size()!=av.size())
    			return false;
    		for(int i=0; i<size(); i++)
    			if(tabella.get(i).equals(x))
    				return false;
    		return true;
    	}
    	
    	public int hashCode(){
    		final int MOLT=41;
    		int h=0;
    		for(int i=0; i<size(); i++)
    			h=h*MOLT+tabella.get(i).hashCode();
    		return h;
    	}
    hashCode() è tecnicamente corretto. equals() no ma più che altro perché hai scritto erroneamente

    if(tabella.get(i).equals(x))

    Che è sbagliato almeno per 2 motivi:
    - x è il AgendinaVector esterno mentre tabella.get(i) dà un Nominativo, quindi stai confrontando patate con carote ...
    - se sono uguali restituisci false. No, se fossero diversi, allora devi ritornare false!

    Se non ci fossero questi errori, allora strutturalmente e tecnicamente sarebbe corretto.

    Tuttavia quanto hai scritto è comunque troppo. Giusto come consiglio: quando nelle tue classi usi oggetti di classi del framework o di altre librerie, verifica con la documentazione javadoc il equals/hashCode di queste classi!
    Infatti per Vector equals/hashCode sono già validi e buoni. Quindi molto più semplicemente:

    codice:
        public boolean equals(Object x){
            // .... test di precondizioni ....
               
            AgendinaVector av=(AgendinaVector)x;
    
            return tabella.equals(av.tabella);
        }
        
        public int hashCode(){
            return tabella.hashCode();
        }

    E potrei dirti ad occhi chiusi che è corretto.


    P.S. comunque, per come l'avevi scritto tu, non avresti dovuti usare il tuo size() ma quello di tabella. Perché? Perché il tuo size() è vero che usa il size() di tabella ma il tuo size è pubblico e potrebbe essere ridefinito in una sottoclasse e il significato potrebbe cambiare.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java 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 © 2024 vBulletin Solutions, Inc. All rights reserved.