Vorrei analizzare insieme a voi il codice di un esercizio che sto facendo.
In poche parole questo esercizio deve gestire un portamonete e le sue monete con aggiunte e rimozioni di monete.
Mi sono bloccato sulla rimozione di una moneta dal portamonete.
Vi riporto il codice della classi:
codice:public class TestMonete { public static void main(String args[]) { Moneta moneta1 = new Moneta(20); Moneta moneta2 = new Moneta(1); Moneta moneta3 = new Moneta(100); //creazione portamonete con 8 monete PortaMonete portamonete1 = new PortaMonete(2,5,100,10,50,10,100,200); // creazione portamonete con 11 monete PortaMonete portamonete2 = new PortaMonete(2,5,100,10,50,10,100,200,10,5,2); // aggiunta moneta da 50 centesimi a portamonete1 portamonete1.aggiungi(new Moneta(50)); portamonete1.stato(); portamonete1.preleva(50); } }codice:public class Moneta { public final static String VALUTA="EURO"; private final int valore; public Moneta(int valore) { this.valore = valore; System.out.println("Creata " + getDescrizione()); } public String getDescrizione() { String descrizione = "moneta da: " + formattaStringaDescrittiva(valore) + VALUTA; return descrizione; } private static String formattaStringaDescrittiva(int valore) { String stringa = " centesimi di "; if (valore == 1) { stringa = " centesimo di "; } else if (valore > 99) { stringa = " "; valore /= 100; } return valore + stringa; } public int getValore() { return valore; } }
Questo è il codice della classe PortaMonete fatta da me:
Rispetto alla soluzione proposta dal manuale le differenze sono:codice:public class PortaMonete { private final Moneta monete [] = new Moneta [10]; public PortaMonete(int... valori) { int numeroMonete = valori.length; for(int i=0; i<numeroMonete; i++) { if (i>=10) { System.out.println("Sono state inserite 10 monete \n"); break; } monete[i] = new Moneta(valori[i]); } } public void aggiungi(Moneta moneta) { System.out.println("Proviamo ad aggiungere una " + moneta.getDescrizione()); int indiceLibero = primoIndiceLibero(); if (indiceLibero == -1) { System.out.println("Portamonete pieno \n"); } else { monete[indiceLibero] = moneta; System.out.println("Moneta inserita correttamente in posizione " + indiceLibero + "\n"); } } private int primoIndiceLibero() { int indice = -1; for(int i=0; i<10; i++) { if(monete[i]==null) { indice = i; break; } } return indice; } public void stato() { for(Moneta moneta : monete) { if(moneta==null) { System.out.println("scansione terminata \n"); break; } System.out.println(moneta.getDescrizione()); } } public void preleva(int valoreMoneta) { for(int i=0; i<monete.length; i++) { if(monete[i].getValore()==valoreMoneta) { System.out.println("moneta trovata in posizione: " + i); monete[i]=null; System.out.println("moneta rimossa"); } } } }
nel main al posto di:codice:portaMonete.preleva(moneta1);
codice:portamonete1.preleva(50);
e:
al posto del mio metodo preleva.codice:public Moneta preleva(Moneta moneta) { System.out.println("Proviamo a prelevare una " + moneta.getDescrizione()); Moneta monetaTrovata = null; int indiceMonetaTrovata = indiceMonetaTrovata(moneta); if (indiceMonetaTrovata == -1) { System.out.println("Moneta non trovata!"); } else { monetaTrovata = moneta; monete[indiceMonetaTrovata] = null; System.out.println("Una " + moneta.getDescrizione() + " prelevata"); } return monetaTrovata; } private int indiceMonetaTrovata(Moneta moneta) { int indiceMonetaTrovata = -1; for (int i = 0; i < 10; i++) { if (monete[i] == null) { break; } int valoreMonetaNelPortaMoneta = monete[i].getValore(); int valore = moneta.getValore(); if (valore == valoreMonetaNelPortaMoneta) { indiceMonetaTrovata = i; break; } } return indiceMonetaTrovata; }
La mia soluzione sembra funzionare, o meglio trova la moneta all'interno dell'array di monete però poi restituisce una NullPointerException.
A vostro avviso la mia soluzione è accettabile (non considerando la NullPointerException)?

Rispondi quotando