Java FH Aufgabe: ArrayList Einkaufsorte

Hallo Zusammen,

ich habe ein Problem bei einer meiner ersten Programmieraufgaben in Java. Es soll eine Einkaufsliste erstellt werden:
Ich eine ArrayList soll folgendes eingegeben werden: (Herkunft Produkt) Hierbei wird bei Herkunft zwischen Supermarkt (a) und Drogeriemarkt (b) unterschieden. Das ganze sieht dann so aus: woEinkaufen.add(“b Spuelmittel”)

Nun ist es in der Aufgabe allerdings auch gewuenscht, dass es Produkte gibt, die man sowohl im Supermarkt als auch im Drogeriemarkt kaufen kann ©. Gibt es keine Produkte, die nur im Drogeriemarkt zu finden sind, werden alle Produkte mit Herkunft c im Supermarkt gekauft und andersherum. Gibt es beides sollen die Produkte die in beiden zu finden sind ebenfalls nur im Supermarkt erstanden werden.

Das einfache Sortieren klappt auch hervorragend (das ist allerdings auch nicht die Kunst, nehme ich an): wenn ich also nur folgende Form habe: woEinkaufen.add(“bl”), geht alles hervorragend, kommt allerdings das Produkt dazu **woEinkaufen.add(“b Spuelmittel”) **klappt das ganze nicht mehr.

Nach einer laengeren Google-Suche denke ich, dass ich mit charAt(0) arbeiten muss, allerdings weiss ich nicht recht wie ich es einbauen soll.

Hier ist mein Code:

public class Artikel {
    
        public static void main(String[] args) throws IOException {
        
            
            System.out.println(woEinkaufen());
        }


        public static ArrayList woEinkaufen (ArrayList) {
            
            ArrayList woEinkaufen = new ArrayList ();
            
            woEinkaufen.add("b Spuelmittel");
            woEinkaufen.add("a Mineralwasser");
            woEinkaufen.add("b Waschmittel");
            woEinkaufen.add("a Paprika");
            woEinkaufen.add("a Eiscreme");
            
           int supermarkt = java.util.Collections.frequency(woEinkaufen, "a");
           int drogiere = java.util.Collections.frequency(woEinkaufen, "b");
           
          
           if (supermarkt == 0){
              for (int i = 0; i < woEinkaufen.size(); i++)
                    {
                    String name = (String)woEinkaufen.get(i);
                        if (name.equals("c")){
                            woEinkaufen.set(i, "b");
                        }
                    }
           }
           else if (drogiere == 0) {
             for (int i = 0; i < woEinkaufen.size(); i++)
                    {
                    String name = (String)woEinkaufen.get(i);
                        if (name.equals("c")){
                            woEinkaufen.set(i, "a");
                        }
                    }
          }
           else {
             for (int i = 0; i < woEinkaufen.size(); i++)
                    {
                    String name = (String)woEinkaufen.get(i);
                        if (name.equals("c")){
                            woEinkaufen.set(i, "a");
                        }
                    }
          }
          
          java.util.Collections.sort(woEinkaufen); 
           
          return woEinkaufen;
            
        }        
} 


Ich wuerde mich sehr ueber Hilfe freuen.

Wenn du mal sowas wie

String name = (String)woEinkaufen.get(i);
System.out.println("Name an Stelle "+i+" ist "+name);
if (name.equals("c")){ ...

einfügen würdest, würdest du sehen, dass der name eben nicht “c” IST, sondern nur damit anfängt. Sowas wie charAt(0) würde gehen, intuitiver vielleicht
if (name.startsWith("c")) ...

Ich würde mit mehreren Listen arbeiten:```public class Artikel {
List supermarkt = new ArrayList();
List drogerie = new ArrayList();

// Generic-Deklaration damit das foreach später funtioniert
List<String> egal = new ArrayList();

public static void main(String[] args) throws IOException {
    // in einer OO-Sprache sollten wir auch mit Objekten arbeiten
    System.out.println(new Artikel().woEinkaufen());
}

private void add(String marktKennzeichen, String artikel) {
    if ("a".equals(marktKennzeichen))
        supermarkt.add("a " + artikel);
    if ("b".equals(marktKennzeichen))
        drogerie.add("b " + artikel);
    if ("c".equals(marktKennzeichen)) {
        egal.add(artikel);
    }
}

/** verteilt Artikel auf die listen */
public List woEinkaufen() {

    add("b", "Spuelmittel");
    add("a", "Mineralwasser");
    add("b", "Waschmittel");
    add("a", "Paprika");
    add("a", "Eiscreme");

    List woEinkaufen = new ArrayList();

    // "egal" Artikel werden immer im SM gekauft wenn wir sowieso da hin müssen
    if (0 == supermarkt.size()) {
        for (String artikel : egal) {
            woEinkaufen.add("b " + artikel);
        }
    } else {
        // wenn wir keine SM-Artikel brauchen kaufen wir "egal"-Artikel in der Drogerie
        for (String artikel : egal) {
            woEinkaufen.add("a " + artikel);
        }
    }
    
    // falls es beide Artikelsorten gibt müssen sie alle der Einkausliste hinzugefügt werden.
    woEinkaufen.addAll(drogerie);
    woEinkaufen.addAll(supermarkt);
    
    
    java.util.Collections.sort(woEinkaufen);

    return woEinkaufen;

}

}```
bye
TT

Im Ernst? Verlangt die Aufgabe wirklich die Verwendung einer ArrayList? Und dann nicht mal generisch? Oder ist das vielmehr Dein etwas kruder Lösungsansatz? Falls es nicht explizit von der Aufgabe verlangt wäre, böte das nämlich die Gelegenheit, hier zu diskutieren, wie man es sehr viel besser machen kann.

Vielen Dank fuer die vielen hilfreichen Antworten.

Diese Ausgabe war nur ein Teil der gesamten Aufgabe, das ganze soll von einer CSV-Datei eingelesen werden. Da ist mir schon gekommen, dass ein Array vielleicht sinniger waere, aber ich habe das Einlesen leider nur als ArrayList hinbekommen.

[quote=helpMe]Da ist mir schon gekommen, dass ein Array vielleicht sinniger waere[/quote]Nein, wäre es nicht. Arrays sind nicht dynamisch. Du müsstest also schon vor dem Lesen der Datei wissen, wie viele Einträge es in der Datei gibt. Und bei der Verarbeitung müsstes Du auch ständig darauf achten, dass Du Arrays der richtigen Größe hast. Alles Arbeit, die man als Java-Entwickler lieber der Laufzeitumgebung überläßt…

Die Anmerkung in Post #4 bezieht sich IMHO ehr daraf, dass man eigentlich eine komplexere Klassenstruktur benötigt:
[ol]
[li]Eine (richtige) Klasse Artikel mit 2 Feldern (Name, Herkunft), wobei letzteres ein enum mit 3 Werten ist.
[/li][li]eine Klasse Einkauf mit 2 Listen (Supermarkt, Drogerie)
[/li][li]eine Klasse EinkaufsListe mit 3 Listen (Supermarkt, Drogerie, egal).
[/li][/ol]

zuerst füllt man die Artikel in ein EinkaufsListe-Objekt.
Wenn alle Artikel eingelesen sind füllt die Einkaufsliste die Artikel ähnlich meinem Vorschlag in ein Einkauf-Objekt.

Das Einkauf-Objekt überschreibt die toString()-Methode so, dass es nur die seiner beiden Listen ausgibt, die nicht leer ist (mit einem entsprechenden Prefix davor). Damit das weniger Arbeit macht überschreibt man auch in der Artikel-Klasse die toString()-Methode sinnvoll.

In der OOP gilt generell die Leitlinie: je mehr Klassen je besser. Selbstverständlich lohnt es sich auf der anderen Seite auch nicht für jeden Pfurz 'ne eigene Klasse zu schreiben, im Zweifel sollte man sich aber lieber für eine neue Klasse entscheiden.

bye
TT

Das ist etwas widersprüchlich, Wenn Produkte aus a <= Produkte aus b, dann in b einkaufen und vice versa?

So solltest du das machen:

     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        ArrayList[] produkte = new ArrayList[3];
        for (int i = 0; i < produkte.length; i++) {
            produkte** = new ArrayList();
        }
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;
        do {
            System.out.println("Bitte a|b|cLeerzeichenProdukt eintippen:");
            line = br.readLine();
            if (line.startsWith("a ")) {
                String p = line.substring(2).trim();
                if (!p.isEmpty()) {
                    produkte[0].add(p);
                }
            } else if (line.startsWith("b ")) {
                String p = line.substring(2).trim();
                if (!p.isEmpty()) {
                    produkte[1].add(p);
                }
            } else if (line.startsWith("c ")) {
                String p = line.substring(2).trim();
                if (!p.isEmpty()) {
                    produkte[2].add(p);
                }
            }
        } while (!line.isEmpty());
        for (int i = 0; i < produkte.length; i++) {
            Collections.sort(produkte**);
        }
        System.out.printf("%20s%20s%20s%n", "Supermarkt", "Drogerie", "Beide");
        for (int i = 0;; i++) {
            if (       i >= produkte[0].size()
                    && i >= produkte[1].size()
                    && i >= produkte[2].size()) {
                break;
            }
            System.out.printf("%20s%20s%20s%n",
                    i < produkte[0].size() ? produkte[0].get(i) : "",
                    i < produkte[1].size() ? produkte[1].get(i) : "",
                    i < produkte[2].size() ? produkte[2].get(i) : "");
        }
    }```

ArrayList<String>[] produkte darf aber nicht einfach so ohne weiteres geschrieben werden.

VlG

Edit:

Ausgabe: 

run:
Bitte a|b|cLeerzeichenProdukt eintippen:
a lappen
Bitte a|b|cLeerzeichenProdukt eintippen:
b creme
Bitte a|b|cLeerzeichenProdukt eintippen:
c halstuch
Bitte a|b|cLeerzeichenProdukt eintippen:
b spueli
Bitte a|b|cLeerzeichenProdukt eintippen:

      Supermarkt            Drogerie               Beide
          lappen               creme            halstuch
                              spueli                    

BUILD SUCCESSFUL (total time: 20 seconds)



Edit 2:

Verkürzt, nicht verbessert: ```        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;
        String pr;
        do {
            System.out.println("Bitte a|b|cLeerzeichenProdukt eintippen:");
            line = br.readLine();
            if (line.startsWith("a ") && !(pr = line.substring(2).trim()).isEmpty()) {
                produkte[0].add(pr);
            } else if (line.startsWith("b ") && !(pr = line.substring(2).trim()).isEmpty()) {
                produkte[1].add(pr);
            } else if (line.startsWith("c ") && !(pr = line.substring(2).trim()).isEmpty()) {
                produkte[2].add(pr);
            }
        } while (!line.isEmpty());```

[quote=CyborgBeta]So solltest du das machen:[/quote]Welchen Vorteil bietet ein Array von Listen gegenüber einzelnen benannten Referenzen auf die Listen?

bye
TT

Die heißen Variablen und nicht einzeln benannte Referenzen. und fahr mich hier nicht an. Stichwort: Erweiterbarkeit könntest du dir mal durchlesen, wenn du dich weiter bilden möchtest. (Ist gaaaanz LIIIEP gemeint, Ehrenwort)

Edit: Hier, bitte schön:

     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Märkte a bis ....:");
        final int N = br.readLine().charAt(0) - ('a' - 1);
        ArrayList[] produkte = new ArrayList[N];
        for (int i = 0; i < N; i++) {
            produkte** = new ArrayList();
        }
        String line;
        String pr;
        do {
            System.out.println("Bitte a|b|cLeerzeichenProdukt eintippen:");
            line = br.readLine();
            for (int i = 0; i < N; i++) {
                if (line.startsWith((char) ('a' + i) + " ")) {
                    if (!(pr = line.substring(2).trim()).isEmpty()) {
                        produkte**.add(pr);
                    }
                    break;
                }
            }
        } while (!line.isEmpty());
        for (int i = 0; i < N; i++) {
            Collections.sort(produkte**);
        }
        System.out.printf("%20s%20s%20s%n", "Supermarkt", "Drogerie", "Beide");
        a:
        for (int i = 0;; i++) {
            b:
            for (;;) {
                for (int j = 0; j < N; j++) {
                    if (i < produkte[j].size()) {
                        break b;
                    }
                }
                break a;
            }
            for (int j = 0; j < N; j++) {
                if (i < produkte[j].size()) {
                    System.out.printf("%20s", produkte[j].get(i));
                } else {
                    System.out.printf("%20s", "");
                }
            }
            System.out.println();
        }
    }```

Ausgabe: 

run:
Märkte a bis …:
c
Bitte a|b|cLeerzeichenProdukt eintippen:
a halstuch
Bitte a|b|cLeerzeichenProdukt eintippen:
b creme
Bitte a|b|cLeerzeichenProdukt eintippen:
c spueli
Bitte a|b|cLeerzeichenProdukt eintippen:
b popcorn
Bitte a|b|cLeerzeichenProdukt eintippen:

      Supermarkt            Drogerie               Beide
        halstuch               creme              spueli
                             popcorn                    

BUILD SUCCESSFUL (total time: 33 seconds)

Also, wenn die Implementierung nicht vorgegeben ist, kann man ggf. über einen etwas objektorientierteren Ansatz nachdenken. Beispielsweise zwei Klassen Bezugsquelle und Artikel. Die Bezugsquelle könnte dann eine List halten (Ist ja schon angeklungen). Wenn man bei Strings bleiben will, dann sind Maps sicher bequemer als Listen/Arrays, wo die Bezugsquelle als erster Buchstabe eines Gesamtstrings codiert ist und auch bequemer als Listen von Listen oder Arrays von Listen oder Arrays von Arrays oder …

Ohne groß nachzudenken ganz grob so:


public final List<String> addArtikelToBezugsQuelle(final String bezugsQuelle, final String artikel) {
  List<String> artikelList = artikelJeBezugsquelle.get(bezugsQuelle);
  if(artikelList == null) {
      artikelList = new ArrayList<>();
      artikelJeBezugsQuelle.put(bezugsQuelle,artikelList);
  }
  artikelList.add(artikel);
  return artikelList;
}

P.S. Know your Collections-API! (Darum scheint es in dieser Aufgabe wohl zu gehen)

Collections kam mir auch schon in den Sinn. Oder einfacher ein Array a bis z, bzw., 0 bis… ähm… ja. Man kann sich über die Eingabe auch Gedanken machen: alle Produkte (durcheinander) oder erst alle Produkte eines Marktes? Man kann sich auch über das Eingabeformat Gedanken machen: w|x|…|z Produkt oder eine bessere Alternative? Dann kann man sich über die Ausgabe Gedanken machen (erst mal sortieren und Längen überprüfen scheint zuvor toll zu sein), z. B., eine Liste per JList, DefaultListModel, ListCellRenderer etc.?

Vielen Dank fuer Eure Zahlreichen, und vor allem hilfreichen, Kommentare.

Das mit den verschiedenen Maerkten ist lediglich eine Teilaufgabe, die Gesamtaufgabe sieht folgendermassen aus:

  1. Es wird eine CSV-Datei eingelesen in der der Bestand an bestimment Artikeln ist, der aufbau ist folgender:
    Artikel, Aktueller Bestand, Mindestbestand, Herkunftsort, Einheit z.B. Kekse,0,2,edeka,Packung

  2. Hieraus wird entschieden welche Artikel fehlen (Aktueller Bestand - Mindestbestand).

  3. Die fehlenden Artikel kommen in eine Liste oder aehnliches.

  4. Die Laeden, die geschlossen ist fallen weg (Supermarkt hat von 8 - 22 geoeffnet, Drogerie von 9 - 20 Uhr, an Donnerstagen bis 22 Uhr.

5 Von diesen soll eine Liste erstellt werden, die Artikel mit dem Attribut “beide” auf die Laeden verteilt (hier hakt es)

  1. Dazu soll noch das “Donald Duck Sonderheft auf die Liste”, dass im Zeitschriftenladen gekauft wird. Dies soll jedoch nur dazu, falls die neue Ausgabe (jeden 1. Dienstag im Monat) gerade erschienen (mitsamt aktueller Ausgabennummer) ist.

  2. Am Ende soll die Liste dann so aussehen:

Drogerie:
Gut 1
Gut 2
Supermarkt:
Gut 1
Gut 2

Zeitschriftenladen:
Heft

In der Umsetzung bin ich relativ frei. Das Ergebniss zaehlt.

Bitte macht ihm doch nicht alle gleich die ganze Arbeit, der soll das doch selber lernen…

[quote=HelpMe]Von diesen soll eine Liste erstellt werden, die Artikel mit dem Attribut “beide” auf die Laeden verteilt (hier hakt es)[/quote]Wo genau?
Es sollte bis hier hin ja schon klar geworden sein, dass Du die “beide”-Artikel in einer separaten Liste halten musst, bist Du alle Artikel eingelesen hast und weist, welchen Markt Du nicht besuchen musst.

BTW: In deinem CSV steh ja der Name eines Ladens. Legt Die Aufgabe fest, dass da nur 2 Verschiedene Namen kommen können? (Falls nicht haben wir noch einen Haufen Arbeit bei der Zuordnung der Artikel zu den Läden, wo man sie bekommt, und die Berechnung des Einkaufsweges wird dann auch komplexer).

Wie wird eigentlich festgelegt, welcher Artikel in welchem Laden zu bekommen sind? Ist das hart im Code oder auch irgendwie konfigurierbar?

bye
TT

Wo genau?
Es sollte bis hier hin ja schon klar geworden sein, dass Du die „beide“-Artikel in einer separaten Liste halten musst, bist Du alle Artikel eingelesen hast und weist, welchen Markt Du nicht besuchen musst.

Das „hier hakt es“ meinte ich im Sinne von „ich bin dran“. Ihr habt mir alles wunderbar erklaert, daher sollte das mittlerweile klappen.

In deinem CSV steh ja der Name eines Ladens. Legt Die Aufgabe fest, dass da nur 2 Verschiedene Namen kommen können?

Ich habe der Drogerie und dem Supermarkt lediglich Namen zugeordent, weil ich das angenehmer fand. Es soll sich tatsaechlich alles auf die beiden beschraenken.

Wie wird eigentlich festgelegt, welcher Artikel in welchem Laden zu bekommen sind?

Das soll fest in der CSV stehen.

@h/HelpMe: Wie weit bist du denn bis jetzt, kannst du die beteiligten Klassen einmal posten? ich bin gerne bereit zu helfen, wo es geht.
:slight_smile:

Vielleicht könnte man auch, abgesehen von dem in der aufgabe verlangten lösungsweg, eine hashmap verwenden…

Mach das komplett oo-orientiert:

Jetzt hast du ein List[] lpa = new ArrayList[256]; für alle 256 Zeichen, die ein byte (nicht char) haben kann. Die nicht benötigten Plätze bleiben dann einfach leer. Sortieren nach Artikelnamen geht natürlich auch.

HashMap wäre etwas überdimensioniert für diese Ausgabe.

(Einige Schleifen lassen sich auch einfach in/nach/zu einer Anweisungszeile vereinfachen.)


        private String artikel;
        private double aktuellerBestand = -1;
        private double mindestBestand = -1;
        private String herkunftsort = "---";
        private String einheit;

        public Prod(String artikel, String einheit) {
            this.artikel = artikel;
            this.einheit = einheit;
        }

        @Override
        public int compareTo(Prod o) {
            int i;
            return (i = artikel.compareTo(o.artikel)) == 0 ? einheit.compareTo(o.einheit) : i;
        }

        @Override
        public String toString() {
            return "Prod{" + "artikel=" + artikel + '}'; // hat mir NetBeans generiert
        }

        public String getArtikel() {
            return artikel;
        }

        public void setArtikel(String artikel) {
            this.artikel = artikel;
        }

        public double getAktuellerBestand() {
            return aktuellerBestand;
        }

        public void setAktuellerBestand(double aktuellerBestand) {
            this.aktuellerBestand = aktuellerBestand;
        }

        public double getMindestBestand() {
            return mindestBestand;
        }

        public void setMindestBestand(double mindestBestand) {
            this.mindestBestand = mindestBestand;
        }

        public String getHerkunftsort() {
            return herkunftsort;
        }

        public void setHerkunftsort(String herkunftsort) {
            this.herkunftsort = herkunftsort;
        }

        public String getEinheit() {
            return einheit;
        }

        public void setEinheit(String einheit) {
            this.einheit = einheit;
        }
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException, NoSuchAlgorithmException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        List<Prod>[] lpa = new ArrayList[256];
        for (int i = 0; i < lpa.length; i++) {
            lpa** = new ArrayList<Prod>();
        }
        String line;
        String pr;
        do {
            System.out.println("Bitte a|b|cLeerzeichenProdukt eintippen:");
            line = br.readLine();
            for (int i = 0; i < lpa.length; i++) {
                if (line.startsWith((char) i + " ")) {
                    if (!(pr = line.substring(2).trim()).isEmpty()) {
                        lpa**.add(new Prod(pr, "stk"));
                    }
                    break;
                }
            }
        } while (!line.isEmpty());
        for (int i = 0; i < lpa.length; i++) {
            Collections.sort(lpa**);
        }
        System.out.printf("%20s%20s%20s%n", "Supermarkt", "Drogerie", "Beide");
        a:
        for (int i = 0;; i++) {
            b:
            for (;;) {
                for (int j = 0; j < lpa.length; j++) {
                    if (i < lpa[j].size()) {
                        break b;
                    }
                }
                break a;
            }
            for (int j = 0; j < lpa.length; j++) {
                if (i < lpa[j].size()) {
                    System.out.printf("%20s", lpa[j].get(i));
                } else {
                    System.out.printf("%20s", "");
                }
            }
            System.out.println();
        }
    }```

Hallo und vielen Dank fuer die grossartige Hilfe.

Ich war ueber die Feiertage nicht da und bin desshalb noch nicht weiter gekommen. Ich habe mich einmal an dem Einlesen per HashMap versucht, leider sieht die Ausgabe als String dann nicht mehr schoen aus.

Das Geschaeftszeitenboolean habe ich noch nicht eingebaut, da ich das auslesen der Strings in der Hashmap einfach nicht hinbekomme. Da ist noch einiges zu tun. Trotzdem, ich bin schon mal stolz auf mich.

Ich benutze Opencsv und Jodatime als externe Bibiotheken, falls das wichtig sein sollte.

import java.util.*;
import org.joda.time.*;
import CSV.*;
import java.io.*;
import java.util.*;
import java.util.Collections.*;
 
public class Einkaufszettel {

 
public static void main(String[] args) throws FileNotFoundException, IOException {
  
    //Zeitvariablen
    LocalDate datum = new LocalDate();
        String tag = datum.toString("EEEE", Locale.GERMAN);
        String verschiebbareFeiertage = Feiertage.verschiebbareFeiertage(datum);
        String festeFeiertage = Feiertage.festeFeiertage(datum);
    LocalTime time = new LocalTime();  
    int stunde = time.getHourOfDay();
    
    //Verarbeitungsvariablen
    String ddsh = tggddsh(datum, festeFeiertage, verschiebbareFeiertage);
    HashMap<String, String> artikel = bestand(ddsh);
   
    System.out.println( einkaufen (festeFeiertage, verschiebbareFeiertage, tag, artikel));
    
  }    
      
private static HashMap bestand (String ddsh) throws FileNotFoundException, IOException {
    
    //Laedt die CSV-Datei
    CSVReader reader;
    reader = new CSVReader(new FileReader("Bestand.csv"));
    
    //Erstellt die HashMap mit den Werten der CSV-Datei
    HashMap<String, String> bestand = new HashMap<String, String>();
    
    String [] nextLine;
            while ((nextLine = reader.readNext()) != null) {
                
             String art = nextLine[0].trim();
             int aktuellerBestand = Integer.parseInt(nextLine[1]);
             int mindestbestand = Integer.parseInt(nextLine[2]);
             int bedarf = mindestbestand - aktuellerBestand;
             
             String einheit = null;
                if (bedarf == 1){
                  einheit =  nextLine[4];
                }
                else {
                   einheit =  (nextLine[4]+"en").replace("ee", "e");
                }
            
             String herkunft = nextLine[3].trim(); // 1 = Edeka; 2 = dm; 3 = Edeka oder dm
             
             String artikel = bedarf + " " + einheit + " " + art;
             
             
             String einkaufsbedarf = null;
                          if (bedarf > 0){
                              einkaufsbedarf = artikel;
                          }
                          else {
                              einkaufsbedarf = null;
                          }
    
                          bestand.put(einkaufsbedarf, herkunft);
            }
      
            //Werte mit Bestand = 0 rausloeschen
            bestand.remove(null);
             
            // Donald Duck dazu tun
            bestand.put(ddsh, "Thalia");
            
            // Falls DD dabei 
                //Supermarkt = REWE, Drogiere = dm, Oeffnungszeiten = Einkaufszentrum
            // Falls nicht 
                //Supermarkt = Edeka, Drogerie = dm
            
            //Testen mit boolean geschaeftszeiten ob aktuelle Zeit innerhalb der Oeffnungzeiten, falls nicht laeden rausloeschen
               // Einkaufszentrum: FR-MI 10 - 20; Do 10 -22
               // EDEKA: 8 - 22, dm: 8 - 20
            
            //Werte mit "beides" auf Supermarkt oder Drogerie verteilen.
            
    return bestand;
  }

private static String tggddsh(LocalDate datum, String festeFeiertage, String verschiebbareFeiertage){
    
        
      //Erster Dienstag ermitteln
        LocalDate ersterDesMonats = new LocalDate (datum.getYear(), datum.getMonthOfYear(), 1);
                
            while(ersterDesMonats.getDayOfWeek() != 2)
            {
                ersterDesMonats = ersterDesMonats.plusDays(1);
            }
         
       // Pruefen ob Tag ein Feiertag ist     
       if (! festeFeiertage.equalsIgnoreCase("Nein")){
           ersterDesMonats = ersterDesMonats.plusDays(7);
       }
       else if (! verschiebbareFeiertage.equalsIgnoreCase("Nein")){
           ersterDesMonats = ersterDesMonats.plusDays(7);
       } 
       else {
           ersterDesMonats = ersterDesMonats;
       } 
            
      //Ausgabennummer ermitteln     
        LocalDate ausgabe178 = new LocalDate(2002, 03, 12);
        Months zeitraum = Months.monthsBetween(ausgabe178, ersterDesMonats);
        int monate = zeitraum.getMonths();
        int ausgabennummer = 178 + monate + 1;       
            
      //Finaler String
        String tggddsh = null;     
      
        if (datum.isBefore(ersterDesMonats)) {
            tggddsh = "";
        }
        else {
            tggddsh = "Die tollsten Geschichten von Donald Duck – Sonderheft, Ausgabe " + (String.valueOf(ausgabennummer)) + " (Erscheinungsdatum: " + (ersterDesMonats.toString("d.MMMM", Locale.GERMAN)) + ")";   
        }
        
        
       
        return tggddsh;
    }

private static String einkaufen (String festeFeiertage, String verschiebbareFeiertage, String tag, HashMap artikel) {
            String einkaufen = null;
            
            String unmoeglich = "Sie koennen leider nicht einkaufen, ";
                       
            if (! festeFeiertage.equalsIgnoreCase("Nein")){
                einkaufen = unmoeglich + "es ist " + festeFeiertage + ". Das ist ein gesetzlicher Feiertag.";
            }
            else if (! verschiebbareFeiertage.equalsIgnoreCase("Nein")){
                einkaufen = unmoeglich + "es ist " + verschiebbareFeiertage + ". Das ist ein gesetzlicher Feiertag.";
            }
            else if (tag.equalsIgnoreCase("Sonntag")){
                einkaufen = unmoeglich + "es ist " + tag + ".";
            }
            else {
                einkaufen = artikel.toString();               
            }
            
            return einkaufen;        
    }

private static boolean geschaeftszeiten (int stunde){
   
   boolean geschaeftszeiten = true;
   
   int open = 8;
   int close = 16;
   
        if ((stunde > open) && (stunde < close)) {
            geschaeftszeiten = true;
        }
        else{
            geschaeftszeiten = false;
        }
   
   return geschaeftszeiten;
}

 }

CSV-Datei:


Kekse,2,2,supermarkt,Packung
Milch,0,3,supermarkt,Packung
Geschirrspuelmittel,0,2,beide,Flasche
Rote Bohnen,0,2,supermarkt,Dose
Toilettenpapier,0,3,beide,Rolle

Lang nicht mehr gemacht, aber doch besser folgendes Objekt/Klasse:

Default-Werte, die einen sagen so, die einen so:

Jetzt noch zwei Methoden erstellen, die aus Prod eine CSV-Zeile machen/erstellen oder einlesen/parsen, und fertig (die meisten der Aufgaben):

        private double aktuellerBestand;
        private double mindestBestand;
        private String herkunftsort;
        private String einheit;

        public Prod(String artikel, double aktuellerBestand, double mindestBestand, String herkunftsort, String einheit) {
            this.artikel = artikel;
            this.aktuellerBestand = aktuellerBestand;
            this.mindestBestand = mindestBestand;
            this.herkunftsort = herkunftsort;
            this.einheit = einheit;
        }

        public Prod(String artikel, String einheit) {
            this(artikel, -1, -1, "---", einheit);
        }```