Java: Wie kann ich den Artikelpreis von einer Artikelliste ändern?

2 Antworten

Ein Problem bei deiner Unsetzung ist die Preis Variable. Diese ist bei dir static, welches nicht sein soll. Jeder Artikel soll sein individuellen Preis haben und nicht ein Preis für jeden Artikel.

Die static Variable AnzahlArtikel und nextArtikelNr würde ich thematisch nicht unbedingt der Artikel Klasse zuordnen, aber static passt hier.

Bei der Umsetzung würde ich noch ein Funktion bei der Klasse Artikel anlegen, die den Preis bei einem Artikel ändert. Das wäre z.B. diese Signatur:

public void changePrize(double percentage)

Diese Methode schließt nicht deine static Methode aus, die eine Liste von Artikeln ändert. In der bevorzugten for each Schleife, wie sie auch von ralphdieter benutzt wurde, kannst du dann die andere Methode auf jedem Artikel aufrufen.

pkelodj 
Fragesteller
 13.01.2023, 21:31

Vielen Dank.
Ja genau "static " bei Preis war nur weil ich einen Fehler bei meinen ChangePrize Methode hat. Aber ich habe es wieder geändert.

Mir ist immer unklar, wie ich die Preise ändern kann. Habe was anderes versucht.

public static void changePrices(Article[] articles, double percentage) {

 

      if (articles == null || articles.length == 0 || percentage < 0) {

      return;

      } else {

      for (int i = 0; i < articles.length; i++) {

      percentage = artciles[i].getPreis() * percentage;

      preis += percentage;

      }

      }

     return;

      }

     

0
ralphdieter  13.01.2023, 22:26
@pkelodj

percentage = überschreibt den Parameter. Du brauchst aber für alle Artikel den Originalwert. Nimm besser eine lokale Hilfsvariable (und vergiss nicht, die Prozent durch 100 zu teilen):

for (int i = 0; i < articles.length; i++) {
    double anteil = artciles[i].getPreis() * percentage / 100;
    preis += anteil;
}

Aber artciles[i].preis *= 1+percentage/100; macht dasselbe, nur kürzer und schneller.

1
pkelodj 
Fragesteller
 13.01.2023, 22:31
@ralphdieter

Hat es gekriegt. anke schön
for (int i = 0; i < articles.length; i++) {

                articles[i].preis *= 1 + percentage / 100;

            }

0
tide1109  13.01.2023, 23:12
@pkelodj
public class Article {
    private double preis;

    public void changePrice(double percentage) {
        preis *= 1 + percentage / 100;
    }

    public static void changeAllPrices(Article[] articles, double percentage) {
        if (articles == null || percentage < 0) {
            return;
        }
        for (var article : articles) {
            article.changePrice(percentage);
        }
    }

    // ...
}

Das hier wäre meine Umsetzung in der Article Klasse. Unwichtige Punkte, die sich auch nicht geändert haben, habe ich hier weggelassen.

Als erstes ist der Preis keine static Variable mehr.

Dazu gibt es eine Methode die auf der Instanz eines Artible Objektes läuft. Mit dieser Methode kannst du sehr leicht den Preis eines Artikels ändern. Du musst nicht den Preis abrufen und dann erneut wieder überschreiben. Dazu ist der preis weiterhin private. Das auf einem Artikel basiert, muss man sich erstmal nicht um das Array kümmern.

Die static Methode changeAllPrices arbeitet auf dem Array. Die for each Schleife ist dazu wesentlich übersichtlicher und auch sicherer als ein for i Schleife. Eine Überprüfung, ob die Länge == 0 ist, kannst du dir sparen. Beide Schleifen Variante werde bei Länge == 0 nicht ausgeführt. Innerhalb der Schleife führst du dann einfach nur die Methode der Instanz auf und übergibst die Prozente.

Mein Variante finde ich persönlich übersichtlich. Dazu wird die Objektorientierung ausgenutzt und wendet auch die übliche Java Umsetzung von privaten Variablen an.

0

Laufe einfach über die Liste und setze die neuen Preise:

public static void changePrices(Article[] articles, double percentage) {
    for ( Article a : articles )
        a.preis *= 1+percentage/100;
}
pkelodj 
Fragesteller
 13.01.2023, 21:10

Damit habe ich angefangen, aber komme nicht weiter wenn ich meinen Test ausführe. Der Preis wird nicht verändert.

public static void main(String[] args) {

        Article article01 = new Article("Uhren", 125.0);

        System.out.println(article01);

        Article[] artikel = new Article[3];

        artikel[0] = new Article("Buch", 35.0);

        artikel[1] = new Article("Lizenz", 260.0);

        artikel[2] = new Article("Software", 250.0);

        Article.changePrices(artikel, 80);

        for (int x = 0; x < artikel.length; x++) {

            if (artikel[x] != null) {

                System.out.println(

                        "ArtikelTitel :" + artikel[x].getbezeichnung() + "Preis" + artikel[x].getbezeichnung());

            }

        }

}

0
ralphdieter  13.01.2023, 21:17
@pkelodj
System.out.println("ArtikelTitel :" + artikel[x].getbezeichnung() 
                + "Preis" + artikel[x].getbezeichnung());

Probiers mal mit .getPreis() – aber erst, nachdem Du den Bug aus tide1109s Antwort (static preis) gefixt hast.

1