Aggiungere new list

di Anonimizzato20478 il
15 risposte
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

  • Che cosa è colonnas innanzitutto?
  • Private HashMap<String, Bevande> lMap;
    private List<Colonna> colonnas = new ArrayList<>();
  • Public class Colonna {

    public int quantita;
    public Bevande bevanda;

    public Colonna(int quantita, Bevande bevanda) {
    this.quantita = quantita;
    this.bevanda = bevanda;
    }
    .....
    .....
  • 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 !
  • 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)
  • 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???
  • 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
  • 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.
  • Devo cancellare return null?
    in pratica come si deve fare?
    mi puoi far vedere la forma corretta in codice.

    grazie
  • 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;
    	}
    
    
  • 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
  • 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.
  • 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();
    		}
    
    
    
  • 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