PDA

View Full Version : [Java] LinkedList (contains)


-Slash
21-07-2011, 18:40
Ragazzi vi giuro che sto impazzendo per una cosa che probabilmente è stupidissima. Ho una classe Iscritti che ha solo due campi nome e cognome di tipo string, e voglio fare una linkedlisk di Iscritti, per poter usare poi i metodi add e compare.

Ho ridefinito quindi le funzioni equals e hashCode della classe in questo modo


public boolean equals(Object o)
{
Iscritto b = (Iscritto)o;
return ((this.nome == b.nome) && (this.cognome == b.cognome));
}

public int hashCode()
{
return (this.nome.hashCode() + this.cognome.hashCode());
}


Ho provato a creare una linkedlist di Iscritti in una classe di prova stupida e la funzione contains funziona perfettamente. Nel momento in cui uso il codice in una mia applicazione corba contains mi restituire sempre false. L'applicazione è corretta perchè usando Vector funziona tranquillamente (ma ci vuole molto più codice)...

La cosa strana è che nella funzione che richiama contains stampo prima tutto il contenuto della lista (per semplicità l'ho riempita con un solo elemento) e poi l'elemento che sto cercando e coincidono, ma mi viene ritornato false!! Posto il codice:


public synchronized boolean checkIscrizione(Iscritto x)
{
Iscritto y = new Iscritto(x.nome.trim(), x.cognome.trim());
System.out.println("Presente in lista " + iscritti.get(0).nome + " " +iscritti.get(0).cognome) ;
boolean result = iscritti.contains(y);
System.out.println("Sto cercando " + x.nome + " " + x.cognome + " " + result);

return result;
}

Ho messo i trim per verificare che eventualmente non ci fossero degli spazi aggiuntivi ma non funziona anche senza...
Mi restituisce il seguente risultato:


Presente in lista C1 C1
Sto cercando C1 C1 false


:confused: :confused: :confused: :confused: :confused:

wingman87
21-07-2011, 18:49
Il confronto tra stringhe lo dovresti effettuare con compareTo oppure equals, con == fai il confronto tra i valori dei riferimenti.

clockover
21-07-2011, 19:00
Io nella funzione equals(Object o) aggiungerei anche questa riga

if(o.getClass() != Iscritto.class)return false;

non è per questo che hai problemi ma comunque eviti di castare una classe che non è quella attesa scatenando un'eccezione

-Slash
21-07-2011, 19:31
Il confronto tra stringhe lo dovresti effettuare con compareTo oppure equals, con == fai il confronto tra i valori dei riferimenti.
Ti amo.

Vengo dal c++ e sono abituato a comparare le stringhe con ==, non avrei mai trovato l'errore :D
Io nella funzione equals(Object o) aggiungerei anche questa riga

if(o.getClass() != Iscritto.class)return false;

non è per questo che hai problemi ma comunque eviti di castare una classe che non è quella attesa scatenando un'eccezione
Grazie per il suggerimento, aggiunto :D