Warenkorb

Hallo, ich versuche gerade einen Warenkorb zu programmieren.

Die Funtkion soll sein:

  1. Ist im Warenkorb ein mit dem neuen Item identisches Objekt vorhanden, dann soll die Anzahl dieses Objekts um 1 erhöht werden.
  2. Ist im Waenkorb das neue Item nicht vorhanden, dann soll ein neues Objekt in den Warenkorb gelegt werden.

Hier die add Methode:

		boolean isEqual = false;
		WarenkorbItem warenkorbItem3 = null;
		
		Produkt addedProdukt = produktRepository.findById(aId);

		
		WarenkorbItem warenkorbItem = null;
			
			if(produkteWarenkorb.size() == 0){
				WarenkorbItem warenkorbItem2 = new WarenkorbItem();
				warenkorbItem2.setProdukt(addedProdukt); 
				warenkorbItem2.setProduktAnzahl(1);
				
				produkteWarenkorb.add(warenkorbItem2);
			}
			else{			
				for(int a=0;a<produkteWarenkorb.size();a++){
						warenkorbItem = produkteWarenkorb.get(a);
						
						if(warenkorbItem.getProdukt().getProduktName().equals(addedProdukt.getProduktName())){
							isEqual = true;
							
							warenkorbItem3 = warenkorbItem;
	
							
						}
						else{
										
						}	
				}
				
				if(isEqual){
					warenkorbItem3.setProduktAnzahl(warenkorbItem.getProduktAnzahl()+1);
				
				}
				else{
					WarenkorbItem wi2 = new WarenkorbItem();
					wi2.setProdukt(addedProdukt);
					wi2.setProduktAnzahl(1);
					
					produkteWarenkorb.add(wi2);
					
				}
			}

		renderBestellung();
	public void renderBestellung(){
				
		for(int a=0;a<produkteWarenkorb.size();a++){
			System.out.println("Produkt: "+produkteWarenkorb.get(a) + " "+produkteWarenkorb.get(a).getProdukt().getProduktName()
					+" "+produkteWarenkorb.get(a).getProdukt().getId()+" "+produkteWarenkorb.get(a).getProduktAnzahl());
		}		
	}


Irgendwie funktioniert das hochzählen der Produktanzahl nicht richtig.

Versuch mal in normaler Sprache deinen Algorithmus zu beschreiben. Der kann so nicht funktionieren.

Btw, falsches Forum, mit Java EE hat das nichts zu tun.

Das ist ja furchtbarer Code.

Das Schrecken beginnt in Zeile 8 mit dem Erstellen der Variable warenkorbItem.
Kommentiere dies schleunigst aus.

Nun entdeckt man alsgleich Fehler in Zeile 19 und 34.
Den Fehler in Zeile 19 behebt man recht einfach in dem man dort die Variable warenkorbItem definiert.

Der Fehler in Zeile 34 bleibt allerdings bestehen. Dann schaut man genauer hin und sieht, dass es dort garnicht warenkorbItem sondern warenkorbItem3 sein sollte.

Dennoch bleibt der Code etwas gruselig.

Angenommen es gäbe eine einfache Funktion. Die einen Warenkorb bekommt sowie ein Produkt und zurückliefert ob dieses Produkt im Warenkorb enthalten ist:

public boolean hasProdukt(Warenkorb warenkorb, Produkt produkt) {...}

Und eine Funktion die ein entsprechendes WarenkorbItem aus einem Warenkorb zurückgibt.
public boolean getWarenkorbItem(Warenkorb warenkorb, Produkt produkt) {...}

Dann kann man das ganze auch etwas einfacher haben.

Produkt addedProdukt = produktRepository.findById(aId);
if(hasProdukt(produkteWarenkorb, addedProdukt)){
  WarenkorbItem item = getWarenkorbItem(produkteWarenkorb, addedProdukt)
  item.setProduktAnzahl(item.getProduktAnzahl() + 1);
} else {
  WarenkorbItem item = new WarenkorbItem();
  item.setProdukt(addedProdukt);
  item.setProduktAnzahl(1);
                   
  produkteWarenkorb.add(item);
}```

Den ganzen Schmarren mit isEqual und den zig verschiedenen durchnumerierten WarenkorbItems kann man sich dan getrost ersparen.

Ich habe jetzt folgende 2 Methoden:

	public boolean hasProdukt(ArrayList<WarenkorbItem>aWarenkorb, Produkt aProdukt) {	
	  	for(int b=0;b<aWarenkorb.size();b++){
    		if(aWarenkorb.get(b).getProdukt().getProduktName().equals(aProdukt.getProduktName()));
    		
    			return true;
    			
    	}
    	
    	return false;
    }

und

    public WarenkorbItem getWarenkorbItem(ArrayList<WarenkorbItem> aWarenkorb, Produkt aProdukt) {
    	WarenkorbItem result= new WarenkorbItem();
    	
    	for(int a=0;a<aWarenkorb.size();a++){
    		if(aWarenkorb.get(a).getProdukt().getProduktName().equals(aProdukt.getProduktName())){
    			result = aWarenkorb.get(a);
    			
    		}
    	}
    	return result; 
    	
    }

Jetzt bekomme ich beim ersten Datensatz ein hasProdukt = false;
und alle anderen Datensätze liefern ein hasProdukt = true;

Wo liegt der Fehler?

Ein Tip von mir:

Das lässt sich wunderbar testen. Nutze einen Unittest und debugge das Problem. Dann wirst Du auch zukünftig bei Änderungen am Code sicher sein, dass alles noch so funktioniert, wie Du es gerne hättest.

Edit:

ein weiterer Tip:

Wenn Du den Unittest geschrieben hast, versuche doch einfach mal ein Hashset zu nutzen, wobei der Key Dein Produktname und der Value die Liste der Items (o.ä.) ist. Dann sollte der Code wesentlich verständlicher sein. (und lass das a vor aProdukt etc weg :))

Ich glaube ich habe den Fehler gefunden.

In der If Anweisung in hasProdukt fehlt die offene Klammer.