OOP Warenlager mit Array(Konstruktor, Methoden)

Diskutiere Warenlager mit Array(Konstruktor, Methoden) im Java Basics - Anfänger-Themen Bereich.
T

temi

Tipp: Falls du dir nicht sicher bist, dann probier es einfach aus:

Java:
public static main(String[] args) {
    int[] a = new int[20];
    
    System.out.println(a[20]);
}
 
W

Wayne139

Hab es geändert.
Macht mein else-Abschnitt Sinn? Ich bekomme jedenfalls keine Fehlermeldung?
Java:
  public void einlagern(Artikel a, int anzahl) {
    for(int i=0; i<waren.length;i++){
      if(waren[i]==null){
        waren[i]= a;
        continue;
      }
      else{
       anzahl+=a.getAnzahl();
      }
    }
  }
Habe noch im Forum ein Thema gefunden, was eine ähnliche Aufgabenstellung hat:
Der Code sieht wie folgt aus:
Java:
    public void einlagern(Ware w, int anzahl) {
        for (int i = 0; i < waren.length; i++) {
            if (waren[i] == null) {
                waren[i] = w;
                w.einlagern(anzahl);
                System.out.println("Ware oder Artikel erfolgreich eingelagert an Position "+ i);
                return;
            }
        }
        System.out.println("Waren konnte nicht eingelagert werden, Warenlager voll");
    }
       public void entnehmen(Ware w, int anzahl) {
        for (int i = 0; i < waren.length; i++) {
            if (waren[i] == w) {
                waren[i].entnehmen(anzahl);

            }
        }
    }
 
Zuletzt bearbeitet:
T

temi

Ich bekomme jedenfalls keine Fehlermeldung?
Das bedeutet ja nicht, dass es so funktioniert wie es soll...

Hab es geändert.
Macht mein else-Abschnitt Sinn? Ich bekomme jedenfalls keine Fehlermeldung?
Java:
public void einlagern(Artikel a, int anzahl) {
    for(int i=0; i<waren.length;i++){
      if(waren[i]==null){
        waren[i]= a;
        continue;
      }
      else{
       anzahl+=a.getAnzahl();
      }
    }
  }
Du prüfst aktuell nur, ob noch ein freier Platz vorhanden ist. Ist das der Fall dann weist du diesem Platz den Artikel zu. Anschließend machst du in der Schleife weiter. Was passiert denn, wenn der nächste Platz auch noch frei ist? Und der Übernächste? Und so weiter?

Außerdem musst die noch die Anzahl der eingelagerten Ware korrekt setzen. Dazu brauchst du die Methode einlagern() von Artikel.
 
J

JustNobody

Macht mein else-Abschnitt Sinn? Ich bekomme jedenfalls keine Fehlermeldung?
Java:
  public void einlagern(Artikel a, int anzahl) {
    for(int i=0; i<waren.length;i++){
      if(waren[i]==null){
        waren[i]= a;
        continue;
      }
      else{
       anzahl+=a.getAnzahl();
      }
    }
  }
Also um es klar zu sagen: Nein, das macht kein Sinn!

Derzeit macht Dein Code folgendes:
- bei ALLEN leeren Plätzen wird a gesetzt.
- bei ALLEN nicht leeren Plätzen erhöhst Du den Wert vom Parameter Anzahl.

Also da würde mich einmal interessieren, was Du mit dem Code beabsichtigen wolltest :)
 
W

Wayne139

Wie sieht es damit aus? Das habe ich aus einem anderen Fourm. Es wurde eine rekursive Methode genutzt.
Java:
        public void einlagern(Artikel a, int anzahl) {
        for (int i = 0; i < waren.length; i++) {
            if (waren[i] == null) {
                waren[i] = a;
                a.einlagern(anzahl);
                System.out.println("Ware oder Artikel erfolgreich eingelagert an Position "+ i);
                return;
            }
        }
        System.out.println("Waren konnte nicht eingelagert werden, Warenlager voll");
Sorry wenn es das nicht, aber ab hier hab ich echt keine Ahnung mehr.
 
T

temi

Wie sieht es damit aus? Das habe ich aus einem anderen Fourm. Es wurde eine rekursive Methode genutzt.
Java:
        public void einlagern(Artikel a, int anzahl) {
        for (int i = 0; i < waren.length; i++) {
            if (waren[i] == null) {
                waren[i] = a;
                a.einlagern(anzahl);
                System.out.println("Ware oder Artikel erfolgreich eingelagert an Position "+ i);
                return;
            }
        }
        System.out.println("Waren konnte nicht eingelagert werden, Warenlager voll");
Sorry wenn es das nicht, aber ab hier hab ich echt keine Ahnung mehr.
Also besser wäre es natürlich, wenn du selbst nachdenken würdest. Abschreiben führt selten zum Erfolg und dann ist es nur ein halber Erfolg, wenn du nicht verstehst, was du machst.

Rekursiv ist da übrigens gar nichts.

Aber es ist zumindest die halbe Lösung.

Du prüfst, ob du einen freien Platz im Array findest, weist den Artikel zu und setzt korrekt die Anzahl für den Parameter, nicht für den eingelagerten Artikel!!! Anschließend verlässt du die Methode. Das ist fast alles richtig.

Aber was ist, wenn der Artikel bereits im Lager ist? Dann soll nur die Anzahl erhöht werden.

Überlege mal die Reihenfolge in der etwas geschehen muss!

Du musst zuerst prüfen, ob der Artikel bereits im Lager ist und ggf. die Anzahl erhöhen. Erst wenn das nicht funktioniert (weil der Artikel noch nicht existiert), dann kommt der Teil, den du jetzt hast.
 
J

JustNobody

Ich denke man müsste eine zweite if einbauen.
Java:
if(waren[i]==waren[i]){
anzahl+=a.getAnzahl();
}
Oder mit waren.equals==true falls es das gibt?
Nein, das ist erst einmal so Quatsch:
- Da auf beiden Seiten der Bedingung das exakt gleiche steht, wird es immer wahr sein.
- Ein Vergleich auf true ist unnötig. Also ein if (Bedingung == true) ist das Gleiche wie if (Bedingung).
- Richtig: Instanzen von Klassen werden mit equals verglichen - aber das setzt in der Regel voraus, dass equals auch überschrieben wurde!

Und bitte denk einmal, wie Du vorgehen würdest. Vergiss Java. Beschreibe nur das generelle Vorgehen!
 
T

temi

Ich denke man müsste eine zweite if einbauen.
Ja, aber das ist nicht genug, denn:

  • Prüfe für jeden Artikel, ob er gleich dem neuen Artikel ist => das ist schon mal eine Schleife über alle Artikel.
  • DANACH: Finde den ersten leeren Platz für den neuen Artikel => das ist auch eine Schleife.
 
W

Wayne139

Vorweg nochmal Danke an euch beiden @temi und @JustNobody.
Mein Vorschlag zu @JustNobody: Zuerst prüfe ich, ob ich im Array einen Artikel habe der schon drin ist, ist das der Fall wird zu der vorhandenen anzahl die neue Anzahl hinzuaddiert. Danach prüfe ich erst, ob ein Array frei ist, ist einer frei werden Artikel und anzahl eingetragen. Es kann auch vorkommen, dass alle Arrays belegt sind, und dann ist halt kein Platz mehr.

Vom Aufbau denke ich, dass eine for-schleife prüft, ob ein Artikel vorhanden ist und eine andere for-Schleife sucht sich den freien Array-Index raus.

@temi: Gegenfrage: Wie genau prüfe ich denn ob ein Array(Index) den selben Artikel(Inhalt) hat, würdest du mir bitte ein Beispiel zeigen? Ich weiß es nicht. if(waren[0]=Obst==waren[0]=Obst)<- Das ist natürlich absolut falsch o_O
Mir wäre es lieber, wenn ihr mir an meinem Code einlagern() zeigt, wie genau ich das bewerkstellige, ich bin jetzt am Punkt wo ich keine Ahnung mehr hab, sorry.
 
T

temi

Vom Aufbau denke ich, dass eine for-schleife prüft, ob ein Artikel vorhanden ist und eine andere for-Schleife sucht sich den freien Array-Index raus.
Richtig! Du brauchst zwei Schleifen, die zweite davon hast du bereits fast korrekt.

Wie genau prüfe ich denn ob ein Array(Index) den selben Artikel(Inhalt) hat
Gute Frage. Kommt drauf an, was (für die Aufgabe) einen Artikel identisch macht. Möglich wäre die Bezeichnung zu nehmen oder die Nummer. Wobei ich nicht weiß, was die Nummer genau ist. Die Artikelnummer? Oder beides muss gleich sein? Optimal wäre es natürlich in Artikel die Methoden equals() und hashCode() zu überschreiben. Allerdings löst das nicht das Ausgangsproblem, was das Identitätsproblem betrifft. Letztlich ist das eine Frage der Definition.

Ein Beispiel wäre: waren[i].getBezeichnung.equals(a.getBezeichnung())
 
W

Wayne139

Richtig! Du brauchst zwei Schleifen, die zweite davon hast du bereits fast korrekt.

Gute Frage. Kommt drauf an, was (für die Aufgabe) einen Artikel identisch macht. Möglich wäre die Bezeichnung zu nehmen oder die Nummer. Wobei ich nicht weiß, was die Nummer genau ist. Die Artikelnummer? Oder beides muss gleich sein? Optimal wäre es natürlich in Artikel die Methoden equals() und hashCode() zu überschreiben. Allerdings löst das nicht das Ausgangsproblem, was das Identitätsproblem betrifft. Letztlich ist das eine Frage der Definition.

Ein Beispiel wäre: waren[i].getBezeichnung.equals(a.getBezeichnung())
Vielen Danke an dich und auch @JustNobody.
Ich werde das Programm soweit wie möglich zuende bringen.
Dieses Thema ist aus meiner Sicht geschlossen.

Eine allgemeine Frage noch zum Forum: Muss ich als Ersteller dieses Themas, dieses auch wieder schließen?
 
mihe7

mihe7

Mir wäre es lieber, wenn ihr mir an meinem Code einlagern() zeigt, wie genau ich das bewerkstellige, ich bin jetzt am Punkt wo ich keine Ahnung mehr hab, sorry.
Das sind absolute Grundlagen - da musst Du durch. In #30 hast Du ja schon den Teil, der noch nicht vorhandene Artikel behandelt. Du kannst aber nicht einfach davon ausgehen, dass ein Artikel nicht vorhanden ist. D. h. davor musst Du eben noch den Teil setzen, der die Mengen bereits vorhandener Artikeln einlagert.

Es gibt ein Paradigma zur Lösung von Problemen, das sich "teile und herrsche" nennt: ist ein Problem zu schwierig, wird es so lange (rekursiv) in einfachere Probleme geteilt, bis sich die Lösung der Teilprobleme einfach genug ist.

Das schöne ist, dass bei solchen Aufgaben genügend Hilfestellung enthalten ist:
Die Methode einlagern() kann neue, noch nicht im Lager enthaltene Artikel aufnehmen. Sie kann
aber auch zu einem schon im Lager vorhandenen Artikel die Anzahl der vorhandenen Exemplare
erhöhen. Das Feld wird beginnend vom Index 0 ab gefüllt. Freie Feldelemente enthalten den Wert null.
Wenn das Warenlager bereits voll ist, wird eine Warnung ausgegeben.
Die ersten beiden Sätze sagen zusammen mit dem UML-Diagramm schon sehr viel. Beim Einlagern eines Artikels a mit der Menge n werden zwei Fälle unterschieden:
  1. Falls sich der Artikel a bereits in der "Liste" (waren) befindet, dann muss die vorrätige Menge in der Liste um n erhöht werden, danach ist das Einlagern abgeschlossen.
  2. Sonst, d. h. falls sich der Artikel a noch nicht in der Liste befindet, muss a mit der Menge n zur Liste hinzugefügt werden, danach ist das Einlagern abgeschlossen.
Wie sich 1. umsetzen lässt, hast Du ja fast schon geschrieben: mit einer for-Schleife und einem if. Die Frage ist natürlich noch, wie die Identität von Artikeln definiert ist. Ich würde mal von der (Artikel-)Nummer ausgehen. Ein Element im Array ist dann gleich dem gesuchten Artikel a genau dann, wenn gilt, dass das Element kein freies Element ist und die Artikelnummer des Elements mit der Artikelnummer des gesuchten Artikels a übereinstimmt.

Java:
// Fall 1
for (int i = 0; i < waren.length; i++) {
    if (waren[i] != null && waren[i].getNummer() == a.getNummer()) {
        // an dieser Stelle entspricht waren[i] dem gesuchte Artikel a
        // hier also einlagern
        // danach:
        return; // das Einlagern ist abgeschlossen
    }
}

// Fall 2
// Code hast Du schon (s. #30)
Das sollte jetzt wirklich reichen, um die Aufgabe fertigzustellen.
 
Thema: 

Warenlager mit Array(Konstruktor, Methoden)

Passende Stellenanzeigen aus deiner Region:
Anzeige

Anzeige

Anzeige
Oben