JAVA Arraylist Berechnen mit int und double und Abspeichern von Zwischenwerten?
Hallo Zusammen
Ich muss in einer Aufgabe int und Double Werte miteinander multiplizieren, siehe im Code bei TODO.
import java.util.ArrayList;
public class Einkauf {
private ArrayList<Produkt> produkte = new ArrayList<Produkt>();
public void addEinkauf(double preis,
int faktor,
int menge,
String name) {
produkte.add(new Produkt(preis, faktor, menge, name));
}
public double getPunkte() {
// TODO: Punkte des Einkaufs berechnen und zurückgeben
double punkte; // sollte richtig sein
for (Produkt p : produkte){
punkte = (preis*menge*faktor); // hier ist ein Fehler
produkte.save(punkte);
return punkte;
}
}
}
Es sollen die Treuepunkte wie folgt berechnet werden: Pro CHF Umsatz gibt es einen Punkt. Rappenbeträge werden berücksichtigt: Kostet ein Produkt CHF 3.20, ergibt dies 3.2 Punkte. Zusätzlich kann bei jedem Produkt ein Faktor angegeben werden. Damit kann der Grossverteiler für bestimmte Produkte mehr Punkte ausschütten. Wenn beispielsweise ein Produkt für CHF 3.20 einen Faktor von 10 hat, gibt es für dieses Produkt 32 Punkte.
Für den oben gezeigten Einkauf beträgt das Punkte-Total 207.15.
Sprich, bei jedem Einkauf soll der zwischenwert gespeichert werden.
Und was genau ist jetzt deine Frage?
Ich habe unten in den Antworten mal den gesamten Code der beiden anderen Classes hinzugefügt. Glaube da ist irgendwo ein "get" fehlend.. can't figure out where...
2 Antworten
double punkte = 0.0; // sollte natürlich noch initialisiert werden.
for (Produkt p : produkte){
// hier musst du natürlich auf die Variablen des jeweiligen Produkts zugreifen
// dehalb immer das "p." davor. In der for-Schleife wird automatisch immer
// das aktuelle Produkt in die Variable p gepackt
// Außerdem musst du natürlich auch noch die Punkte addieren
punkte += (p.preis * p.menge * p.faktor);
// produkte.save(punkte); // Was willst du damit bewirken?
}
// Das return muss außerhalb der for-Schleife sein, sonst
// übergibst du ja immer nur die Punkte vom ersten Produkt
return punkte;
Alternativ natürlich wie immer noch die Stream-Variante:
public double getPunkte() {
return produkte.stream()
.mapToDouble(p -> p.preis * p.menge * p.faktor)
.sum();
}
Ok. Du hast von deiner Main-Klasse keinen direkten Zugriff auf die Variablen preis, menge und faktor. In der Produkt-Klasse sind dafür aber Getter implementiert, die du dafür nehmen kannst:
punkte += (p.getPreis() * p.getMenge() * p.getFaktor());
Hallo besten Dank für deine Hilfe. Nun habe ich aber ein Problem, die Produktclass sieht folgendermassen aus und darf nicht verändert werden:
public class Produkt {
private double preis;
private int faktor;
private int menge;
private String name;
public Produkt(double preis, int faktor, int menge, String name) {
this.preis = preis;
this.faktor = faktor;
this.menge = menge;
this.name = name;
}
public double getPreis() {
return preis;
}
public int getFaktor() {
return faktor;
}
public int getMenge() {
return menge;
}
public String getName() {
return name;
}
}
& die Mainclass sieht folgendermassen aus:public class Main {
public static void main(String[] args) {
// Testdaten
Einkauf e1 = new Einkauf();
Einkauf e2 = new Einkauf();
Einkauf e3 = new Einkauf();
e1.addEinkauf(4.2, 1, 2, "Pizzakäse");
e1.addEinkauf(5.7, 20, 2,"Alanatura Müesli");
e2.addEinkauf(1.75, 1, 5,"Milch");
e2.addEinkauf(1.7, 1, 2, "Gurke");
e2.addEinkauf(5.5, 1, 2, "Schokohase Freddy");
e3.addEinkauf(2.2, 5, 3, "Spaghetti");
e3.addEinkauf(3.4, 1, 2, "Sugo Basilikum");
e3.addEinkauf(9.6, 5, 1, "Olivenöl Bio");
e3.addEinkauf(7.8, 5, 1, "Schokoeili assortiert");
System.out.println("Einkauf 1: "+e1.getPunkte());
System.out.println("Einkauf 2: "+e2.getPunkte());
System.out.println("Einkauf 3: "+e3.getPunkte());
}
}
import java.util.ArrayList;
public class HelloWorld {
public static void main(String[] args) {
Einkauf einkauf = new Einkauf();
// Preis: 3.20, Faktor: 10, Menge: 1
einkauf.addEinkauf(3.20, 10, 1, "Einkauf");
// Ergebnis: 32.0
System.out.println(einkauf.getPunkte());
}
}
public class Produkt {
// Statt „protected“-Felder kann man auch
// sog. Getter-Methoden verwenden, um auf
// die Werte zuzugreifen.
protected double preis = 0;
protected int faktor = 0, menge = 0;
protected String name;
public Produkt(
double preis,
int faktor,
int menge,
String name
) {
this.preis = preis;
this.faktor = faktor;
this.menge = menge;
this.name = name;
}
}
class Einkauf {
private ArrayList<Produkt> produkte = new ArrayList<Produkt>();
public void addEinkauf(
double preis,
int faktor,
int menge,
String name
) {
produkte.add(new Produkt(preis, faktor, menge, name));
}
public double getPunkte() {
double punkte = 0;
// Punkte für jedes einzelne Produkt ermitteln
for (Produkt p : produkte) {
punkte += (p.preis * p.menge * p.faktor);
}
// Gesamtzahl der Punkte zurückgeben
return punkte;
}
}
Hallo besten Dank für deine Hilfe. Nun habe ich aber ein Problem, die Produktclass sieht folgendermassen aus und darf nicht verändert werden:
public class Produkt {
private double preis;
private int faktor;
private int menge;
private String name;
public Produkt(double preis, int faktor, int menge, String name) {
this.preis = preis;
this.faktor = faktor;
this.menge = menge;
this.name = name;
}
public double getPreis() {
return preis;
}
public int getFaktor() {
return faktor;
}
public int getMenge() {
return menge;
}
public String getName() {
return name;
}
}
& die Mainclass sieht folgendermassen aus:public class Main {
public static void main(String[] args) {
// Testdaten
Einkauf e1 = new Einkauf();
Einkauf e2 = new Einkauf();
Einkauf e3 = new Einkauf();
e1.addEinkauf(4.2, 1, 2, "Pizzakäse");
e1.addEinkauf(5.7, 20, 2,"Alanatura Müesli");
e2.addEinkauf(1.75, 1, 5,"Milch");
e2.addEinkauf(1.7, 1, 2, "Gurke");
e2.addEinkauf(5.5, 1, 2, "Schokohase Freddy");
e3.addEinkauf(2.2, 5, 3, "Spaghetti");
e3.addEinkauf(3.4, 1, 2, "Sugo Basilikum");
e3.addEinkauf(9.6, 5, 1, "Olivenöl Bio");
e3.addEinkauf(7.8, 5, 1, "Schokoeili assortiert");
System.out.println("Einkauf 1: "+e1.getPunkte());
System.out.println("Einkauf 2: "+e2.getPunkte());
System.out.println("Einkauf 3: "+e3.getPunkte());
}
}
da ist lediglich ein Fehler in der Zeile "punkte+=(p.preis * p.menge * p.faktor); "