OOP Warenlager mit Array(Konstruktor, Methoden)

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

Wayne139

Guten Abend,

ich habe vorerst eine kleine Frage bezüglich Arrays. In meiner Klasse Warenlager soll ich über einen Konstruktor die größe eines Arrays vorgeben.
Java:
public class Warenlager {

  public Ware[] waren;
 
//Konstruktor
  public Warenlager(int maxAnzahl){
    waren = new Ware[maxAnzahl];
  }

}
ich bekomme die Fehlermeldung: Ware cannot be resolved to a type.

Ich habe gelesen, dass man Arrays beispielsweise so deklarieren kann:
int[] feld;
Punkt[] bildpunkte; <- so wollte ich es machen
String[] texte;


Ich hoffe mir kann jemand helfen :)
 
mihe7

mihe7

ch bekomme die Fehlermeldung: Ware cannot be resolved to a type.
Das heißt, dass der Compiler den Typ "Ware" nicht finden kann. In der Regel liegt das daran, dass Du entweder
  1. noch keine Klasse (Interface, enum) für Ware geschrieben hast oder
  2. sich Ware in einem anderen Paket befindet und der import fehlt oder
  3. Ware sich nicht im Classpath befindet (z. B. weil sich die Klasse in einer Bibliothek befindet und die Abhängigkeit nicht deklariert wurde)
 
W

Wayne139

Das heißt, dass der Compiler den Typ "Ware" nicht finden kann. In der Regel liegt das daran, dass Du entweder
  1. noch keine Klasse (Interface, enum) für Ware geschrieben hast oder
  2. sich Ware in einem anderen Paket befindet und der import fehlt oder
  3. Ware sich nicht im Classpath befindet (z. B. weil sich die Klasse in einer Bibliothek befindet und die Abhängigkeit nicht deklariert wurde)
Hallo mihe7,

ich habe noch ein UML vorgegeben, vielleicht kannst du mir das daran besser erklären?
Die anderen Klassen sind soweit erledigt. Ich habe aber noch insgesamt Probleme mit der Klasse Warenlager.
Laut UML hat Artikel eine Aggregation auf Warenlager?
In meiner Aufgabenstellung steht, dass Warenlager eine Containerklasse ist und ein Feld waren enthält.

12804
 
J

Javinner

Ich klinke mich mal ein..mkay
Warenlager(maxAnzahl : int) -> maximale Warenlagerkapazität
einlagern(a: Artikel, Anzahl : x ) Artikel(String name, int anzahl) -> artikel vorhanden ? artilkel plus neuZugang : artikel;
entnehmen(a: Artikel, int anzahl) Artikel(String name, int anzahl) > genug vorhanden ? -artikel : wasSollNunPassierenWennNicht?
artikelPruefen() : vorhanden? wieviel? (Artikel: anzahl) -> vorhanden Zahl x; vorhanden Überhaupt?
print() -> drücke(Artikel name, Artikel anzahl)


Ist es jetzt klar?
 
T

tommysenf

Das Feld welche die Assoziation abbildet heisst waren und ist vom Typ Artikel:


Java:
public class Warenlager {

public Artikel[] waren;

//Konstruktor
public Warenlager(int maxAnzahl){
waren = new Artikel[maxAnzahl];
}

}
}
 
mihe7

mihe7

Laut UML hat Artikel eine Aggregation auf Warenlager?
In meiner Aufgabenstellung steht, dass Warenlager eine Containerklasse ist und ein Feld waren enthält.
Ja, ein Warenlager aggregiert 0..n Artikel. In Deiner Warenlager-Klasse schreibst Du aber nichts von Artikel sondern von Waren :)
public Ware[] waren; -> private Artikel[] waren
 
W

Wayne139

Schonmal vielen Dank für die Antworten.

Ich möchte jetzt noch die Methoden für das Warenlager schreiben.
In der Aufgabe steht zu den Methoden:
1) 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.
2) Die Methode entnehmen() entnimmt eine entsprechende Anzahl von Exemplaren eines im Lager vorhandenen Artikels. Sie gibt eine Warnung aus, wenn der gewünschte Artikeltyp nicht im Warenlager vorrätig ist.

Leider komm ich mit den Methoden überhaupt nicht klar, in meiner Klasse Warenlager habe ich den folgenden "Code":
Java:
public class Warenlager {

  public Artikel[] waren;

  public Warenlager(int maxAnzahl){
    waren = new Artikel[maxAnzahl];
  }
 
//Versuch Methode einlagern()
  public void einlagern(Artikel a, int anzahl) {
    waren[0]= ;
  }

  public void entnehmen(Artikel a, int anzahl) {}
}
Bei der Methode einlagern() bin ich mir schon total unsicher. Kann mir da jemand bitte helfen?
 
T

tommysenf

Schritt 1: Du musst nachschauen ob sich der einzulagernde Artikel bereits im Warenlager befindet...
Wie würdest du das machen?
 
W

Wayne139

Hi tommysenf,

ich würde mithilfe einer if-anweisung prüfen, ob der static int aktuelleNummer (primärschlüssel) bereits gesetzt wurde ? Oder prüfen ob der Array noch mit NULL gefüllt ist?
Java:
//Versuch Methode einlagern()
  public void einlagern(Artikel a, int anzahl) {
   if(Artikel.aktuelleNummer!=0)
  }
 
W

Wayne139

Ansonsten, du hast ein Array mit Artikeln und möchtest wissen, ob ein weiterer Artikel bereits darin enthalten ist. Mit wievielen anderen Artikeln musst du diesen dann vergleichen?
Ich muss die mit allen verglichen, soviele wie ich vorher im Konstruktor erzeugt habe. Bräuchte ich dann eine zählschleife die alle einzelnen waren[0 bis max] prüft?
 
W

Wayne139

Wie sieht es hiermit aus?
Java:
  public void einlagern(Artikel a, int anzahl) {
    for(int i=0; i<=waren.length;i++){
      if(waren[i]==null){
        //waren[i]= a, anzahl;  <--???
      }
      else{
      continue;
      }
    }
  }
wie ich allerdings in den Array a und anzahl übergebe, weiß ich nicht.
 
T

temi

Wie sieht es hiermit aus?
Na, ich nehme doch an, dass du es mal ausprobiert hast, dann weißt du ja, wie es aussieht ;)

Aber fangen wir mal am Anfang an:

1. Welchen Wert hat i, wenn i <= waren.length gerade noch gilt?
2. Und auf welchen Index im Array greifst du dann zu?
3. Was ist denn der höchste gültige Index im Array?

Wenn du einen neuen Artikel dem Array zuweisen willst, dann machst du das einfach mit:

waren[index] = a;

Die Anzahl der Artikel steckt laut deinem UML ja bereits im Artikel. Ich kenne deine Aufgabe nicht, aber wahrscheinlich benötigst du den zusätzlichen Parameter anzahl gar nicht.

Edit: OK, laut UML muss die Anzahl als Parameter übergeben werden. Sei es so. Auch Artikel verfügt über eine Methode einlagern(), die die Anzahl verändert. Die wirst du brauchen.

Bei einem bereits vorhandenen Artikel musst du dir die Anzahl aus dem als Parameter übergebenen Artikel holen mit a.getAnzahl().

Edit: Aktuell überprüfst du in deiner Schleife nur, ob ein freier Platz vorhanden ist (also überhaupt kein Artikel da ist). Du musst ja auch prüfen, ob ein Artikel bereits vorhanden ist.
 
Zuletzt bearbeitet:
W

Wayne139

1. wenn ich den Array mit 20 Feldern erstellt habe, dann wäre meine Antwort: i=20<=20
2. im ersten Durchlauf greife ich auf waren[0] zu und das sollte bis waren[20] durchlaufen wenn meine if nicht vorher auf ein Array mit NULL trifft.
3. das gebe ich an, über maxAnzahl im Konstruktor vom Warenlager?

Später soll ich alles mit einer Main testen.
Hier ein Ausschnitt:
Java:
public static void main(String[] args)
{
Warenlager lager = new Warenlager(10);
Milchprodukt frischMilch =new Milchprodukt("Frischmilch", 0.89, new Datum(17, 1, 2009), 7.0);
lager.einlagern(frischMilch, 500);
lager.entnehmen(frischMilch, 150);
lager.print();
//Ausgabe: [B]Artikelnr.: 0, Bezeichnung: Frischmilch, Anzahl: 350[/B]
 
Zuletzt bearbeitet:
T

temi

1. wenn ich den Array mit 20 Feldern erstellt habe, dann wäre meine Antwort: i=20<=20
2. im ersten Durchlauf greife ich auf waren[0] zu und das sollte bis waren[20] durchlaufen wenn meine if nicht vorher auf ein Array mit NULL trifft.
3. das gebe ich an, über maxAnzahl im Konstruktor vom Warenlager?
Bei einem Array mit 20 Feldern ist der erste Index 0 und der letzte gültige Index 19.

Und jetzt denk noch mal darüber nach.
 
J

JustNobody

Die Anzahl der Artikel steckt laut deinem UML ja bereits im Artikel. Ich kenne deine Aufgabe nicht, aber wahrscheinlich benötigst du den zusätzlichen Parameter anzahl gar nicht.
Da es im UML bereits enthalten ist, wird der Parameter schon Sinn machen.

Daher finde ich das Design insgesamt etwas Fragwürdig. Artikel hat entweder schon eine Anzahl, dann muss es nicht mehr separat angegeben werden oder es ist eben nicht Bestandteil.

Daher wäre da aus meiner Sicht eine Unterteilung angebracht in Artikel und EingelagerterArtikel. Ersterer hat keine Menge, zweites hat eine Menge. Dann könnte man die eingelagerten Artikel durchgehen und schauen: Ist der Artikel schon eingelagert? Dann würde man ggf. einfach die Anzahl erhöhen.

Aber so ist die Logik nicht wirklich klar gegeben. Was soll gemacht werden? Wenn Anzahl separat gegeben ist: Soll dann Anzahl im Artikel überschrieben werden? Oder ist ein neuer Artikel anzulegen, der Name / Preis übernimmt, Anzahl ist der übergebene Parameter und dafür wird im übergebenen Artikel die Anzahl reduziert?

Letzteres würde bedeuten: Ich habe außerhalb einen Artikel: "Hundefutter, 10kg Tüte", Preis "4,99", 200 Stück.
Und nun sage ich: Einlagern von diesem Artikel, 50 Stück. Dann lagern danach "Hundefutter, 19kg Tüte" mit Preis "4,99", 50 Stück im Lager. Und der ursprüngliche Artikel ist dann: "Hundefutter, 10kg Tüte", Preis "4,99", 150 Stück.

Aber evtl. gab es ja bereits im Lager einen Artikel "Hundefutter, 10kg Tüte", Preis "4,99", 75 Stück. Dann wäre meine Erwartungshaltung, dass dieser dann um 50 erhöht wird, d.h. die Anzahl wird um 50 erhöht.
 
T

temi

Da es im UML bereits enthalten ist, wird der Parameter schon Sinn machen.
Hab ich gesehen und auch oben korrigiert.

Daher finde ich das Design insgesamt etwas Fragwürdig. Artikel hat entweder schon eine Anzahl, dann muss es nicht mehr separat angegeben werden oder es ist eben nicht Bestandteil.
Volle Zustimmung!

Artikel wird laut UML im Konstruktor ohne Anzahl erstellt. Der Weg scheint also immer über einlagern() zu führen.
 
W

Wayne139

Bei einem Array mit 20 Feldern ist der erste Index 0 und der letzte gültige Index 19.

Und jetzt denk noch mal darüber nach.
Ok, also zur
1. i=19<=19
2. im ersten Durchlauf greife ich auf waren[0] zu und das sollte bis waren[20] durchlaufen wenn meine if nicht vorher auf ein Array mit NULL trifft.
3. wie du geschrieben hast die 19
 
T

temi

Ok, also zur
1. i=19<=19
2. im ersten Durchlauf greife ich auf waren[0] zu und das sollte bis waren[20] durchlaufen wenn meine if nicht vorher auf ein Array mit NULL trifft.
3. wie du geschrieben hast die 19
1. Bei i <= waren.length wird der höchste Wert von i = 20 sein, wie du schon richtig erkannt hattest.
2. Richtig
3. Richtig

Zusatzfrage: Was passiert, wenn du auf waren[20] zugreifen willst und der höchste gültige Index 19 ist?
 
Thema: 

Warenlager mit Array(Konstruktor, Methoden)

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben