Inserimento in lista

di il
8 risposte

Inserimento in lista

Salve,

vi riporto la soluzione di un metodo che stavo vedendo.

Ovvero, questo:

un metodo void addLibro(String titolo, String autore) che aggiunge un libro a quelli disponi bili. Se nella biblioteca e' gia' presente un altro libro con stesso titolo ed autore, il numero di copie viene incrementato di uno. In caso contrario, una nuova istanza di un oggetto della classe libro con un numero di copie pari ad uno viene inserito nella lista.

ed eccolo:

public void addLibro(String titolo, String autore)
{
	Libro old = getLibro(titolo, autore);
	if (old == null)
	    libri.add(new Libro(titolo, autore, 1));
	else
	    old.setNumeroCopie( old.getNumeroCopie() + 1);
}
Non vi riporto tutta la classe perché è parecchio lunga e non credo serva per la mia domanda, comunque:

getLibro: ritorna null se titolo ed autore non corrispondono per nessun libro all'interno di libri (che è un hashSet).
Libro(titolo, autore, 1): costruttore della classe Libro che crea un nuovo libro da aggiungere all'hashSet con 1 che è il numero di copie.
setNumeroCopie e getNumeroCopie rispettivamente setta/ritorna numero di copie.

Nel testo di sopra, viene chiesto "Se nella biblioteca e' gia' presente un altro libro con stesso titolo ed autore, il numero di copie viene incrementato di uno".

Mi riferisco, quindi a questo frammento di codice:
	else
	    old.setNumeroCopie( old.getNumeroCopie() + 1);
Quando io vado ad incrementare il numero di copie di old di uno, io sto incrementando il numero di copie di un oggetto Libro (old, appunto) che non appartiene all'insieme Libri. Vero? Cioè, io non sto incrementando il numero di copie di un oggetto che appartiene all'insieme Libri, ma di un oggetto che ho creato lì, nel metodo. O sbaglio?

8 Risposte

  • Re: Inserimento in lista

    davide.fruci ha scritto:


    getLibro: ritorna null se titolo ed autore non corrispondono per nessun libro all'interno di libri (che è un hashSet).
    Innanzitutto un chiarimento: getLibro usa quel libri (HashSet) facendo una iterazione sul set, verificando ciascun Libro e se è quello cercato lo restituisce?
    Se è così, tecnicamente è ok (non è efficiente, ovvio, ma non stiamo ora a sindacare ....).

    davide.fruci ha scritto:


    Mi riferisco, quindi a questo frammento di codice:
    	else
    	    old.setNumeroCopie( old.getNumeroCopie() + 1);
    Quando io vado ad incrementare il numero di copie di old di uno, io sto incrementando il numero di copie di un oggetto Libro (old, appunto) che non appartiene all'insieme Libri. Vero?
    Se getLibro fa quello che ho detto prima (ovvero restituisce l'oggetto Libro che è già esistente nell'insieme), allora ovviamente appartiene all'insieme!
  • Re: Inserimento in lista

    andbin ha scritto:


    Innanzitutto un chiarimento: getLibro usa quel libri (HashSet) facendo una iterazione sul set, verificando ciascun Libro e se è quello cercato lo restituisce?
    Se è così, tecnicamente è ok (non è efficiente, ovvio, ma non stiamo ora a sindacare ....).
    Sì:
        public Libro getLibro(String titolo, String autore) {
    	Iterator<Libro> it=libri.iterator();
    	while (it.hasNext()){
    	    Libro l = it.next();
    	    if (l.getTitolo().equals(titolo) &&
    		l.getAutore().equals(autore))
    		return l;
    	}
    	return null;
        }

    andbin ha scritto:


    Se getLibro fa quello che ho detto prima (ovvero restituisce l'oggetto Libro che è già esistente nell'insieme), allora ovviamente appartiene all'insieme!
    è questo che non capisco. Forse mi sono spiegato male io.

    Quando io faccio:

    Libro old = getLibro(titolo, autore);

    creo un oggetto Libro che sì, "appartiene" (non intendo appartenere nel senso di trovarsi nell'insieme hashSet) a libri per quanto riguarda la corrispondenza di titolo ed autore, ma "fisicamente" (se non si entra nel primo ramo dell'if) old non viene aggiunto a libri (libri.add(old)). Quindi non posso dire che vi appartiene, no?

    Quando io modifico il numero di copie di old vado a modificare un campo di old, ok. Ma old non è collegato all'hashSet, quindi io l'hashSet non l'ho modificato alla fine..

    è come se io avessi un array

    v[3] = {1, 2, 3};
    int old= v[0];
    old= 5;

    v[0] rimane sempre 1..

    Cioè, io credo sarebbe sensato modificare il numero di copie di un oggetto che è collegato (intendo proprio fisicamente in termini di puntatori) all'hashSet.
  • Re: Inserimento in lista

    davide.fruci ha scritto:


        public Libro getLibro(String titolo, String autore) {
    	Iterator<Libro> it=libri.iterator();
    	while (it.hasNext()){
    	    Libro l = it.next();
    	    if (l.getTitolo().equals(titolo) &&
    		l.getAutore().equals(autore))
    		return l;
    	}
    	return null;
        }
    Tecnicamente ok. (si poteva usare il for-each ... veniva più "pulito" ).

    davide.fruci ha scritto:


    Ma old non è collegato all'hashSet
    Quel libro È nel HashSet!
    Libro l = it.next();   // prende il libro "corrente" che è nel HashSet
    
    if (....)
        return l;   // restituisce quel libro che È nel HashSet!
  • Re: Inserimento in lista

    D'accordo quello che dici tu.

    Però guarda, ho implementato un altro metodo:
        public int getNumeroLibriSpecifico(String titolo, String autore)
        {
            int countLibri = 0;
            Libro temp = null;
            
            ListIterator<Libro> i = lista.listIterator();
            while(i.hasNext())
            {
                temp = i.next();
                if(temp.getTitolo().equals(titolo) && temp.getAutore().equals(autore))
                    countLibri++;
            }
            
            return countLibri;
                
        }
    Che mi ritorna il numero di copie di un libro specifico.

    Ora nel main:
    
    Biblioteca prima = new Biblioteca("Angelica", "Piazza di Sant'Agostino, 8");
            
    prima.addLibro("Il signore degli anelli", "Tolkien");
    prima.addLibro("Il signore degli anelli 2", "Tolkien");
    prima.addLibro("Il signore degli anelli 3", "Tolkien");
                   
    System.out.println(prima.getNumeroLibriSpecifico("Il signore degli anelli", "Tolkien"));
            
    prima.addLibro("Il signore degli anelli", "Tolkien");
            
    System.out.println(prima.getNumeroLibriSpecifico("Il signore degli anelli", "Tolkien"));
    
    Il primo System.out.println mi da uno, e va bene.

    prima.addLibro("Il signore degli anelli", "Tolkien"); aggiunge un nuovo libro all'insieme libri, se non è già presente nell'insieme. Caso contrario, aumenta di uno il numero di copie del libro.

    Il nostro caso è proprio quest'ultimo.

    Tuttavia, il secondo System.out.println mi da nuovamente uno quando le copie, dopo quest'ultima aggiunta, dovrebbero essere due.

    Il metodo addLibro non va bene..
  • Re: Inserimento in lista

    davide.fruci ha scritto:


            ListIterator<Libro> i = lista.listIterator();
    Cos'è "lista"? C'entra qualcosa con quel "libri" che usa getLibro ?
  • Re: Inserimento in lista

    Sì, scusa lista sarebbe libri. Ho cambiato nome per la fretta di scrivere.

    Comunque, mi sa che ho frainteso io. Perché quando aggiungo un libro devo andare a modificare il numero di copie, e non il numero di libri.
    Che alla fine sono la stessa cosa, penso. Dire ho cinque libri uguali è identico a dire ho cinque copie dello stesso libro.

    Ho risolto ora, grazie per l'aiuto
  • Re: Inserimento in lista

    davide.fruci ha scritto:


    Perché quando aggiungo un libro devo andare a modificare il numero di copie, e non il numero di libri.
    Guarda, sono un po' preso dal lavoro questo pomeriggio e non l'ho notato subito: il tuo getNumeroLibriSpecifico stava contando il numero di libri con quel titolo/autore .... ovviamente ne hai solo 1!
    Basta getLibro, poi se lo trovi, usi getNumeroCopie. Stop, tutto qui.
  • Re: Inserimento in lista

    Ok, grazie!
Devi accedere o registrarti per scrivere nel forum
8 risposte