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:
Se eseguo il MainTest_1 come output ottengo: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_2 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
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





