mergeProducts wie Methode schreiben?

Guten Tag!

Ich weiss nicht genau wie ich folgende Aufgabe lösen soll. Ich habe einen Warenkorb in dem ich einige Produkte einfüge.

Code:
public class WarenkorbTest {
    public static void main(String[] args) {
        Warenkorb w = new Warenkorb();
        Produkt p1 = new Produkt(1, "Fahrrad", 2000.00);
        w.addProdukt(1, p1);            
        Lebensmittel l1 = new Lebensmittel(1,"Schoggi", 2.00, 200);
        w.addProdukt(1, l1);
        Lebensmittel l2 = new Lebensmittel(1,"Schoggi", 2.00, 200);
        w.addProdukt(3, l2);
        Kleider k = new Kleider(1,"Jeans", 100.00, 36);
        w.addProdukt(1, k);
       
        System.out.println(w.mergeProduct());
    }    
}
Ich sammle die Daten des Produkts und die bestellte Anzahl in zwei unterschiedlichen Arrays:
Code:
    public void addProdukt(int q, Produkt p){
        this.products.add(p);
        this.quantity.add(q);
    }
Wie schaffe ich es falls sich Produkte mit dem selben Namen (Produkt.getName()) im Warenkorb befinden, diese Einträge zusammen zu fassen und die Anzahl zu korriegieren?

Code:
public ArrayList<Produkt> mergeProduct(){
        
        if(products.size()==0)return null;
        if(products==null)return null;
        for(Produkt p: products){
            .....
        }
        return results;
        
    }
Herzlichen Dank schon im vorraus für die Hilfe.
 
Dafür benutzt man im allgemeinen LineItems. Ein LineItem verbindet den Warenkorb mit dem Produkt. Hier wird dann meist auch der Verkaufspreis und die Anzahl hinterlegt. Der Link zum Produkt ist damit quasi nur notwendig um Metadaten (Beschreibung, Bild) zu halten.

Der Grund ist folgender: Produktpreise können sich ändern. Wenn der Kunde etwas kauft soll aber meistens der Preis zum Kaufzeitpunkt auf der Rechnung stehen. Durch das LineItem ist es möglich die Produktpreise zu ändern, ohne alte Warenkörbe / Rechnungen zu beeinflussen. Zum anderen hältst du so ganz einfach die Anzahl der Items. D.h. das Hinzufügen eines LineItems zum Warenkorb legt es entweder in den Warenkorb oder erhöht einfach die Anzahl.

Gruß
Ollie
 
Hallo Oliver!

Danke für die Antwort, möchte das Ganze jedoch ohne LineItem lösen, auch wenn dies sicher die elegantere Variante für den Praxisbetrieb ist. War eine Aufgabe in einer Prüfung zum Thema Arraylist und Schlaufen und ich wusste nicht wie lösen.

Jetzt frage ich mich natürlich wie ich die Aufgabe richtig gelöst hätte. Kann mir da trozdem jemand helfen ? Auch wenn es sicher nicht die schönste Lösung ist ?

Gruess

Ruth
 
Wenn ich Deinen 2. Code Abschnitt sehe, nehme ich an, dass Du Produkte und Quantitäten in 2 Listen (z.B. ArrayList) verwaltest. Falls dem so ist sind die Indizes in Deinem Verfahren die Verbindung zwischen Produkt und Menge.
Du müsstest also wenn der Kunde ein Produkt wählt schauen ob es schon in seinem Warenkorb ist mit der Rückgabe des Inexes. Ist die Ware nicht vorhanden so verwendest Du einfach einen Index < 0. Das kann man entweder zu Fuß in einer Iterationsschleife machen, oder man verwendet die vom java.util.List dafürvorgesehene Routine int indexOf(Object).

Den dann gefundenen Index, so Produkt schon im Warenkorb, verwendest Du dann auf die Menge.
addProdukt sähe demnach ungefär so aus:
Java:
...
class Warenkorb ...
{
  List<Produkt> products    = ArrayList<Produkt>();
  List<Integer> quantities  = ArrayList<Integer>();


   public void addProduct(int m, Produkt p)
   {
       int x = products.indexOf(p);
       if (x>=0)
       {
           quantities.set(x,quantities.get(x)+m);
       }
       else
       {
            products.add(p)
            quantities.add(m);
       }
   }

}
Analog dazu wäre eine Routine die das entfernen von Produkten aus dem Warenkorb ermöglicht nicht ganz unwichtig.

Olivers Vorschlag ist auf jeden Fall mittel bis langfristig gesehen der sinnvollere.
 
Zurück