Aggiungere new list

di il
15 risposte

Aggiungere new list

Non riesco ad aggiungere nuovi elementi nella lista

// Aggiorna Colonna delle bevande
	public void aggiornaColonna(String codBevanda, int qta) {
		// è aggiornato
		boolean isUpdated = false;

		if (colonnas.size() == 0) {

			colonnas.add(new Colonna(qta, lMap.get(codBevanda))); // aggiungi colonna

		} else { // la lista non è vuota

			// la colonna esiste
			for (int i = 0; i < colonnas.size(); i++) {

				// aggiorna quantità colonna esistente
				if (codBevanda != null && codBevanda.equals(colonnas.get(i).getBevanda().getCodice())) {
					qta = qta + colonnas.get(i).getQuantita();// aggiorna la quantita delle lattine
					colonnas.get(i).setQuantita(qta);
				}
				
			}
			// se non è stato aggiornata la quantità perchè non è presente nella lista
			// allora aggiungo la nuova colonna (se non sei già a 4)

			if(colonnas.size() <= 4)
				
				colonnas.add(new Colonna(qta, lMap.get(codBevanda)));

		}

	}


Mi stampa solo un elemento
Numero di colonna: 0 Codice: a Quantità: 60

devo stampare più elementi nella lista

nel main

// codice A
			distributore.aggiornaColonna("a", 40);

			// codice A --> ripeto di nuovo per verificare se fa la somma
			distributore.aggiornaColonna("a", 20); // totale lattine = 60

			// codice B
			distributore.aggiornaColonna("b", 100);

			// codice C
			distributore.aggiornaColonna("c", 260);
		
			System.out.println(distributore);

15 Risposte

  • Re: Aggiungere new list

    Che cosa è colonnas innanzitutto?
  • Re: Aggiungere new list

    Private HashMap<String, Bevande> lMap;
    private List<Colonna> colonnas = new ArrayList<>();
  • Re: Aggiungere new list

    Public class Colonna {

    public int quantita;
    public Bevande bevanda;

    public Colonna(int quantita, Bevande bevanda) {
    this.quantita = quantita;
    this.bevanda = bevanda;
    }
    .....
    .....
  • Re: Aggiungere new list

    Ok, ora è più chiaro. Da quello che vedo nel tuo codice di aggiornaColonna, un problema è sicuramente il fatto che tu fai il ciclo for per aggiornare la quantità ma poi dopo, se c'è spazio, vai comunque ad inserire una nuova Colonna. Pertanto puoi trovarti dati duplicati.

    Io comunque ti suggerirei di fare così (e nota come viene MOLTO più semplice e lineare):
        public void aggiornaColonna(String codBevanda, int qta) {
            if (codBevanda == null) {
                // che vuoi fare? lanciare eccezione?
            }
    
            Colonna colonna = getColonnaPerBevanda(codBevanda);
    
            if (colonna != null) {
                // Colonna trovata: aggiunge solo quantità
                colonna.setQuantita(colonna.getQuantita() + qta);
            } else if (colonnas.size() <= 4) {
                // Colonna NON trovata E c'è ancora posto: aggiunge nuova Colonna
                colonnas.add(new Colonna(qta, lMap.get(codBevanda)));
            }
        }
    
        private Colonna getColonnaPerBevanda(String codBevanda) {
            for (Colonna colonna : colonnas) {
                if (codBevanda.equals(colonna.getBevanda().getCodice())) {
                    return colonna;
                }
            }
    
            return null;
        }

    P.S. attenzione ai campi public e alle denominazioni !
  • Re: Aggiungere new list

    Come si risolve??
    // se non è stato aggiornata la quantità perchè non è presente nella lista
    // allora aggiungo la nuova colonna (se non sei già a 4)
  • Re: Aggiungere new list

    Ho visto come l'hai fatto è semplice, ma nel mai visto che l'indice che deve aggiungere è 4
    mi aggiunge sempre 1 è non va oltre, come mai, provando il tuo codice???
  • Re: Aggiungere new list

    Questo è il mio metodo toString

    public String toString() {
    for (int i = 0; i < colonnas.size(); i++) {
    return "Numero di colonna: " + i + " Codice: " + colonnas.get(i).getBevanda().getCodice() + " Quantità: "
    + colonnas.get(i).getQuantita();

    }
    return null;

    }

    nel main mi doveva chiamare questo metodo, ma soltanto continua ad aggiungere solo una riga e non oltre
  • Re: Aggiungere new list

    robot ha scritto:


    public String toString() {
    for (int i = 0; i < colonnas.size(); i++) {
    return "Numero di colonna: " + i + " Codice: " + colonnas.get(i).getBevanda().getCodice() + " Quantità: "
    + colonnas.get(i).getQuantita();

    }
    return null;

    }
    Purtroppo così il toString è profondamente sbagliato. Perché è vero che fai un ciclo ma al primo indice fai già un return e .... stop, finisce lì restituendo solo la stringa per il primo elemento!

    No, devi COMPORRE man mano ad ogni ciclo una stringa che poi alla fine restituisci.
  • Re: Aggiungere new list

    Devo cancellare return null?
    in pratica come si deve fare?
    mi puoi far vedere la forma corretta in codice.

    grazie
  • Re: Aggiungere new list

    L'ho corretto:
    
    public String toString() {
    String stampa = "";
    		
    for (int i = 0; i < colonnas.size(); i++) {
    	stampa = "Numero di colonna: " + colonnas.get(i) + "Codice: " + colonnas.get(i).getBevanda().getCodice() + "Quantità: " + 		colonnas.get(i).getQuantita();
    		}
    		
    		return stampa;
    	}
    
    
  • Re: Aggiungere new list

    Ho notato quando avvio il main esce la seguente stampa:

    Numero di colonna: 2 Codice: c Quantità: 20

    ma le quattro righe non escono, insomma mi doveva stampare 4 righe di cui 2 righe sono dello stesso codice "a" facendo la somma.
    in totale doveva stampare 3 righe
  • Re: Aggiungere new list

    robot ha scritto:


    
    public String toString() {
    String stampa = "";
    		
    for (int i = 0; i < colonnas.size(); i++) {
    	stampa = "Numero di colonna: " + colonnas.get(i) + "Codice: " + colonnas.get(i).getBevanda().getCodice() + "Quantità: " + 		colonnas.get(i).getQuantita();
    		}
    		
    		return stampa;
    	}
    
    In realtà no, non è ancora "corretto". Perché ASSEGNI (invece di concatenare) a stampa. Quindi quella che poi restituisci è solo la stringa dell'ultimo elemento.

    Comunque, giusto perché lo sappia, fornire dal toString() una stringa multi-riga, non è il massimo. Nel senso che dipende poi da dove la si usa. Nel tuo chiaramente su console. Allora perlomeno usa la sequenza di newline specifica della piattaforma.
  • Re: Aggiungere new list

    Grazie 1000, mi hai fatto capire tantissimo, ti faccio di nuovo i complimenti, che sei molto bravo.


    Ho risolto la stampa sulla console
    
    public String toString() {
    		StringBuilder stampa = new StringBuilder();
    		
    		for (int i = 0; i < colonnas.size(); i++) {
    			//sb.append(i).append(colonnas.get(i).getBevanda().getCodice()).append(colonnas.get(i).getQuantita());
    			stampa.append(" indice: ").append(i);
    			stampa.append(" Codice: ").append(colonnas.get(i).getBevanda().getCodice());
    			stampa.append(" Quantità: ").append(colonnas.get(i).getQuantita());
    			stampa.append("\n");
    		}
    			
    		return stampa.toString();
    		}
    
    
    
  • Re: Aggiungere new list

    robot ha scritto:


    Ho risolto la stampa sulla console
    
    public String toString() {
    		StringBuilder stampa = new StringBuilder();
    		
    		for (int i = 0; i < colonnas.size(); i++) {
    			stampa.append(" indice: ").append(i);
    			stampa.append(" Codice: ").append(colonnas.get(i).getBevanda().getCodice());
    			stampa.append(" Quantità: ").append(colonnas.get(i).getQuantita());
    			stampa.append("\n");
    		}
    			
    		return stampa.toString();
    		}
    
    Sì, StringBuilder va benissimo. L'unica questione è sul "newline". Il "\n" non è il newline su tutte le piattaforme. Se volessimo fare la cosa valida per qualunque piattaforma:

    stampa.append(System.getProperty("line.separator"));
Devi accedere o registrarti per scrivere nel forum
15 risposte