- 22,948
- 11,581
- CPU
- 1-Neurone
- Dissipatore
- Ventaglio
- RAM
- Scarsa
- Net
- Segnali di fumo
- OS
- Windows 10000 BUG
Non va bene per il motivo che supponi: sta confrontando dei riferimenti.
Quello che devi fare sono le seguenti azioni:
La ridefinizione di equals va fatta nella classe libro con il seguente codice
public boolean equals(Object altroOggetto) {// corpo di equals}
Cosa ci va nel corpo?
Ti illustro una tecnica che vale in generale per qualunque tipo di oggetto.
Innanzitutto 2 oggetti sono sicuramente uguali se i loro riferimenti sono uguali (significa ovviamente che puntano lo stesso ogggetto). Quindi la prima istruzione DEVE essere
if(this==altroOggetto) return true;
poi bisogna considerare il caso speciale che l'oggetto di confronto altroOggetto sia null; in tal caso i libri sono sicuramente diversi (un Libro non vuoto non può essere uguale a null. Quindi la seconda istruzione DEVE essere
if(altroOggetto==null) return false;
Per essere uguali, 2 oggetti devono essere della stessa classe: se le classi degli oggetti confrontati sono diverse i 2 oggetti non possono essere uguali. Quindi la terza istruzione DEVE essere
if(getClass() != altroOggetto.getClass()) return false;
fino a qui le sitruzioni che ti ho illustrate sono valide per qualunque tipo di oggetto. Adesso viene la parte facile: ti serve confrontare i campi specifici di un Libro. Innanzitutto si fa una conversione di tipo: serve a trasformare un Object generico in un Libro
Libro altro = (Libro)altroOggetto;
Adesso ti basta confrontare i campi stringa per nome e titolo
return autore.equals(altro.autore) && titolo.equals(altro.titolo);
oppure a secondo di come hai implementato la classe potresti dover scrivere
return getAutore().equals(altro.getAutore()) && getTitolo().equals(altro.getTitolo())
So che è complicato ma per fare le cose correttamente bisogna procedere in questo modo. Se non fai così sei tentato di confrontare solo titolo e autore. Però il vantaggio è che questa tecnica è generalizzabile a tutti gli oggetti: sono solo 5 istruzioni da inserire in quell'ordine.
Alla fine, con un semplice ciclo ti scorri l'ArrayList, prendi l'oggetto i, lo confronti con il libro che ti interessa e, se sono uguali, ritorni l'indice.
con riferimento al codice che avevo scritto per la classe Libri che avevo immaginato, il metodo equals() è così: fai copia-incolla eventualmente adattandolo alla tua classe e convinciti che funziona
Quello che devi fare sono le seguenti azioni:
- ridefinire il metodo equals() all'interno della classe Libro. Tale metodo serve a "decidere" quando un oggetto Libro può essere considerato uguale ad un altro oggetto Libro. Verosimilmente puoi decidere che 2 libri sono uguali se hanno lo stesso autore e lo stesso titolo, senza considerare il prezzo.
- poi scorri l'ArrayList confrontando di volta in volta il libro in posizione i-esima con il Libro che stai controllando e, se sono uguali restituisci l'indice i, altrimenti passi al libro successivo dell'ArrayList. Tutto questo fino a quando o trovi illibro o finisce l'ArrayList
La ridefinizione di equals va fatta nella classe libro con il seguente codice
public boolean equals(Object altroOggetto) {// corpo di equals}
Cosa ci va nel corpo?
Ti illustro una tecnica che vale in generale per qualunque tipo di oggetto.
Innanzitutto 2 oggetti sono sicuramente uguali se i loro riferimenti sono uguali (significa ovviamente che puntano lo stesso ogggetto). Quindi la prima istruzione DEVE essere
if(this==altroOggetto) return true;
poi bisogna considerare il caso speciale che l'oggetto di confronto altroOggetto sia null; in tal caso i libri sono sicuramente diversi (un Libro non vuoto non può essere uguale a null. Quindi la seconda istruzione DEVE essere
if(altroOggetto==null) return false;
Per essere uguali, 2 oggetti devono essere della stessa classe: se le classi degli oggetti confrontati sono diverse i 2 oggetti non possono essere uguali. Quindi la terza istruzione DEVE essere
if(getClass() != altroOggetto.getClass()) return false;
fino a qui le sitruzioni che ti ho illustrate sono valide per qualunque tipo di oggetto. Adesso viene la parte facile: ti serve confrontare i campi specifici di un Libro. Innanzitutto si fa una conversione di tipo: serve a trasformare un Object generico in un Libro
Libro altro = (Libro)altroOggetto;
Adesso ti basta confrontare i campi stringa per nome e titolo
return autore.equals(altro.autore) && titolo.equals(altro.titolo);
oppure a secondo di come hai implementato la classe potresti dover scrivere
return getAutore().equals(altro.getAutore()) && getTitolo().equals(altro.getTitolo())
So che è complicato ma per fare le cose correttamente bisogna procedere in questo modo. Se non fai così sei tentato di confrontare solo titolo e autore. Però il vantaggio è che questa tecnica è generalizzabile a tutti gli oggetti: sono solo 5 istruzioni da inserire in quell'ordine.
Alla fine, con un semplice ciclo ti scorri l'ArrayList, prendi l'oggetto i, lo confronti con il libro che ti interessa e, se sono uguali, ritorni l'indice.
con riferimento al codice che avevo scritto per la classe Libri che avevo immaginato, il metodo equals() è così: fai copia-incolla eventualmente adattandolo alla tua classe e convinciti che funziona
Java:
public boolean equals(Object altroOggetto) {
if(this==altroOggetto) return true;
if(altroOggetto==null) return false;
if(getClass() != altroOggetto.getClass()) return false;
Libro altro = (Libro)altroOggetto;
return autore.equals(altro.autore) && titolo.equals(altro.titolo);
}
Ultima modifica: