Ragazzi ho ancora problemi con un altro esercizio
Dovevo gestire una Biblioteca, utilizzando una struttura dati Mappa, ma non era specificato quale implementazione.
Le possibili scelte erano: LinkedHashMap, TreeMap e HashMap, e ho scelto di provare per prima con la HashMap.
Vi posto soltanto la parte di codice che mi dà problemi.
Questa è la classe Libro, che poi sarà utilizzata come CHIAVE per la mappa:
codice:
public class Libro{
private String autore;
private String titolo;
public Libro(String autore, String titolo)
{
this.autore=autore;
this.titolo=titolo;
}
public String getAutore() {
return autore;
}
public String getTitolo() {
return titolo;
}
public String toString()
{
return ("Autore: " + autore + "\n" + "Titolo: " + titolo + "\n");
}
}
Questa è la classe InfoLibro, che poi verrà usata come VALORE per la mappa:
codice:
public class InfoLibro {
private int copieLibro;
private int copieInPrestito;
public InfoLibro (int copieLibro)
{
this.copieLibro=copieLibro;
copieInPrestito=0;
}
public int getCopieLibro() {
return copieLibro;
}
public void setCopieLibro(int copieLibro) {
this.copieLibro = copieLibro;
}
public int getCopieInPrestito() {
return copieInPrestito;
}
public void setCopieInPrestito(int copieInPrestito) {
this.copieInPrestito = copieInPrestito;
}
public String toString()
{
return ("Copie Libro: " + copieLibro + "\n" + "Copie in prestito: " + copieInPrestito + "\n");
}
Questa è la classe Libreria (ho allegato solo una parte del codice), che sarà il mio Buffer condiviso tra Produttore-Consumatore:
codice:
import java.util.HashMap;
public class Libreria {
private HashMap<Libro, InfoLibro> libreria;
public Libreria ()
{
libreria = new HashMap<Libro, InfoLibro>();
}
public void inserisciLibro(Libro l, int copie)
{
if (libreria.containsKey(l)) //se il libro è già presente nella libreria
{
InfoLibro temp = libreria.get(l);
temp.setCopieLibro(temp.getCopieLibro() + copie);
}
else //libro non presente nella libreria
{
libreria.put(l, new InfoLibro(copie));
}
}
Questo è il MainTest_1:
codice:
public class TestLibreria {
public static void main(String[] args) {
Libreria libreria;
libreria = new Libreria();
Libro l1, l2, l3;
l1 = new Libro("Autore 1", "Titolo 1");
l2 = new Libro("Autore 2", "Titolo 2");
l3 = l1;
libreria.inserisciLibro(l1, 3);
libreria.inserisciLibro(l2, 2);
libreria.inserisciLibro(l1, 10);
libreria.inserisciLibro(l3, 10);
System.out.println(libreria.toString());
Questo è MainTest_2:
codice:
public class TestLibreria {
public static void main(String[] args) {
Libreria libreria;
libreria = new Libreria();
libreria.inserisciLibro(new Libro("Autore 1", "Titolo 1"), 3);
libreria.inserisciLibro( new Libro("Autore 2", "Titolo 2"), 2);
libreria.inserisciLibro( new Libro("Autore 1", "Titolo 1"), 10);
libreria.inserisciLibro( new Libro("Autore 2", "Titolo 2"), 10);
System.out.println(libreria.toString());
Se eseguo il MainTest_1 come output ottengo:
codice:
Autore: Prova_Autore 1
Titolo: Prova_Titolo 1
Copie Libro: 23
Copie in prestito: 0
Autore: Prova_Autore 2
Titolo: Prova_Titolo 2
Copie Libro: 2
Copie in prestito: 0
Se eseguo il MainTest_2 come output ottengo:
codice:
Autore: Prova_Autore 1
Titolo: Prova_Titolo 1
Copie Libro: 3
Copie in prestito: 0
Autore: Prova_Autore 2
Titolo: Prova_Titolo 2
Copie Libro: 2
Copie in prestito: 0
Autore: Prova_Autore 1
Titolo: Prova_Titolo 1
Copie Libro: 10
Copie in prestito: 0
Autore: Prova_Autore 2
Titolo: Prova_Titolo 2
Copie Libro: 10
Copie in prestito: 0
Praticamente nel test 1 le chiavi uguali vengono riconosciute (cioè i Libri) mentre nel test 2 no; infatti nel test 1 vengono aggiornate le copie dei libri disponibili invece nel test 2 anche se cerco di inserire libri già presenti non vengono riconosciuti come libri già esistenti nella biblioteca e quindi non vengono aggiornati i numeri delle copie ma vengono aggiunti nuovamente nella HashMap come se fossero nuovi libri.
L'unica differenza è che nel test 1 al metodo inserisciLibro della Libreria passiamo un riferimento di un oggetto Libro creato già, mentre nel secondo test passiamo un riferimento di un oggetto Libro creato al momento; quindi anche se creiamo due oggetti con lo stesso Autore e Titolo, essi hanno riferimento diversi.
Quindi ho ipotizzato che la put della HashMap non controlla il contenuto dell'oggetto Libro ma si limita soltanto a confrontare i riferimenti della chiavi.
E' corretta questa ipotesi?
Grazie