Altklausur: Abfrage der Summe

Peek

Mitglied
Hallo,

ich lerne gerade anhand einer Altklausur und hänge an folgender Aufgabe:

1.) Erzeuge eine Produkt-Instanz unter Angabe des Namens und des Preises
2.) Setzen des Preises
3.) Abfragen des Preises
4.) Abfragen der Anzahl der erzeugten Instanzen und der Summe der Preise

Die Aufgaben 1-3 sind soweit kein Problem. Konstruktor für die erste Aufgabe, get- und set-Methoden für Aufgabe 2 + 3 und für Aufgabe 4.1 in den Konstruktor eine Variable Anzahl, als anzahl++ einsetzen. Allerdings komme ich mit der Summe der Preise nicht ganz zurecht. Wenn ich bspw.:
Code:
summe = summe + getpreis();
mit in den Konstruktor schreibe, erhalte ich zwar die summe der preise, allerdings nur für die Preise die ich von Beginn an zur Verfügung habe. Sollte ich also jetzt die setpreis()-Methode anwenden hat dies keinen Einfluss mehr. Deshalb dachte ich mir die Methode auszulagern in eine eigene, was allerdings zur Folge hat, dass nur der neue Preis ausgegeben wird.

Hat vielleicht einer eine weitere Idee?
 
Code:
public Produkt (String name, int preis){ //Konstruktor
this.name = name;
this.preis = preis;
anzahl++
}

public void setpreis (int preis){ this.preis = preis;}
public int getpreis(){ return this.preis;}
public int gesamt(){
gesamt += getpreis();
return gesamt;
}

public String toString(){
return "Anzahl Produkte: " + anzahl + " " + "Gesamtpreis: " + gesamt();
}

Lege ich nun 2 Objekte an, erhalte ich jediglich die Ausgabe des Preises des jeweiligen Objekts.
 
Möglich wäre die Umsetztung auch mit statischen Attributen. Damals ist darauf auch der Professor nicht gekommen, fand es aber ganz nett, dass man quer denkt.

Java:
public class Produkt {
    public static int ANZAHL_DER_INSTANZEN = 0;
    public static double SUMME_DER_INSTANZEN = 0;
 
    private String name;
    private double preis;
 
    public Produkt(String name, double preis) {
        setName(name);
        setPreis(preis);
   
        ANZAHL_DER_INSTANZEN++;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public double getPreis() {
        return preis;
    }
 
    public void setPreis(double preis) {
        // Für den Fall, dass der Gesamtpreis mit verändert werden soll
        SUMME_DER_INSTANZEN -= getPreis();
        this.preis = preis;
        SUMME_DER_INSTANZEN += preis;
    }
}

Java:
public class Example {
    public static void main(String[] args) {
        Produkt produkt1 = new Produkt("Klobürste", 0.12);
        System.out.println(Produkt.ANZAHL_DER_INSTANZEN);
        System.out.println(Produkt.SUMME_DER_INSTANZEN);
        Produkt produkt2 = new Produkt("Zahnbürste", 1.49);
        System.out.println(Produkt.ANZAHL_DER_INSTANZEN);
        System.out.println(Produkt.SUMME_DER_INSTANZEN);

        produkt2.setPreis(0.1);
        System.out.println(Produkt.SUMME_DER_INSTANZEN);
    }
}

Ausgabe
Code:
1
0.12
2
1.61
0.22
 
Zuletzt bearbeitet:
Wow! Vielen dank, das hat mir sehr geholfen 🙂

Erstelle eine Liste deiner Produkte, iteriere über diese Liste und rechne die Preise zusammen.

habe ich ausprobiert, indem ich:
Code:
ArrayList<Integer> list = new ArrayList<>();
angelegt habe und darauf aufbauend habe ich versucht, items auf die Liste zu setzen, was allerdings zur Folge hatte, dass ich für jedes erzeugte Objekt auch eine neu erzeugte Liste hatte..eine Idee wie das aussehen sollte? Mein Code sah zwischenzeitlich so aus http://pastebin.com/736s6Wyd
 
Du sollst die Liste auch nicht in deiner Klasse Wine deklarieren und befüllen sondern in der main Methode 😉 oder eben in der Klasse welche die ganzen Wine Objekte dann verwalten soll
 
Das wäre es ohne statische Variablen so wie es Joose vorschlägt
Java:
public class Example {
    public static void main(String[] args) {
        List<Produkt> produkte = new ArrayList<Produkt>();
        Produkt produkt1 = new Produkt("Klobürste", 0.12);
        Produkt produkt2 = new Produkt("Zahnbürste", 1.49);
        produkte.add(produkt1);
        produkte.add(produkt2);

        double summe = 0;
        for(Produkt produkt : produkte) {
            summe += produkt.getPreis();
        }
        System.out.println(summe);
    }
}
Geht übrigens auch mit Java8 Streams.
Java:
    double summe = produkte.stream()
                //die doubles von getPreis() holen
                .map(Produkt::getPreis)
                // die einzelnen Preise addieren
                .reduce((a, b) -> a + b).get();

//original: List { Produkt1,  Produkt2}
//nach stream(): Stream { Produkt1,  Produkt2}
//nach map: List { double,  double}
//nach reduce: Optional<Double>
//nach get: double
 
Zuletzt bearbeitet:

Zurück
Oben