RISOLTO Stampa di un ArrayList in Java

Stato
Discussione chiusa ad ulteriori risposte.

BAT

Moderatore
Staff Forum
Utente Èlite
9,609
4,130
CPU
Neurone solitario
Dissipatore
Ventaglio azionato a mano
Scheda Madre
Casalinga
RAM
Molto molto volatile
GPU
Binoculare integrata nel cranio
PSU
Pastasciutta, pollo e patatine al forno
Net
Segnali di fumo e/o tamburi
OS
Windows 10000 BUG
Non va bene per il motivo che supponi: sta confrontando dei riferimenti.
Quello che devi fare sono le seguenti azioni:
  1. 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.
  2. 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
Mentre il punto 2 è facile, il punto 1 è piuttosto complicato, anche se a prima visto potrebbe non sembrarlo (non basta confrontare titolo e autore). Per confronatare 2 oggetti con il metodo equals() la sintassi da usare è if(oggetto1.equals(oggetto2))...
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:
  • Mi piace
Reazioni: Alessandro001

Alessandro001

Utente Attivo
160
7
CPU
Ryzen 5 1600 3.2GHz
Scheda Madre
MSI B350 Tomahawk
HDD
Seagate ST1000DM010 1 TB
RAM
2X8GB Corsair CMK16GX4M2B3000C15 Vengeance
GPU
RADEON RX 580 NITRO+ Radeon RX 580 8GB GDDR5
Monitor
HP 27FW Monitor 27"
PSU
Cooler Master MasterWatt Lite 700 230V
Case
Aerocool Aero-800
Net
https://www.speedtest.net/result/8773872068.png
OS
Windows 10
Non va bene per il motivo che supponi: sta confrontando dei riferimenti.
Quello che devi fare sono le seguenti azioni:
  1. 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.
  2. 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
Mentre il punto 2 è facile, il punto 1 è piuttosto complicato, anche se a prima visto potrebbe non sembrarlo (non basta confrontare titolo e autore). Per confronatare 2 oggetti con il metodo equals() la sintassi da usare è if(oggetto1.equals(oggetto2))...
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);
}
Iperchiaro nella spiegazione, appena posso lo implemento e ti faccio sapere.
Grazie mille!
 

Alessandro001

Utente Attivo
160
7
CPU
Ryzen 5 1600 3.2GHz
Scheda Madre
MSI B350 Tomahawk
HDD
Seagate ST1000DM010 1 TB
RAM
2X8GB Corsair CMK16GX4M2B3000C15 Vengeance
GPU
RADEON RX 580 NITRO+ Radeon RX 580 8GB GDDR5
Monitor
HP 27FW Monitor 27"
PSU
Cooler Master MasterWatt Lite 700 230V
Case
Aerocool Aero-800
Net
https://www.speedtest.net/result/8773872068.png
OS
Windows 10
Ho appena implementato il codice che mi hai consigliato e funziona alla perfezione.
Ti ringrazio infinitamente per l'aiuto e spero di migliorare le mie capacità nella programmazione.
Grazie ancora :D
 
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando

Discussioni Simili