Modellierung, vererbung,

Noob1234_1234

Aktives Mitglied
Hallo zusammen,
ich soll einen ContainerTerminal modellieren. Dieser besteht insgesamt aus Containerstapeln und einem Kran, der Stapel wiederum aus 2 Arten von Container (mit ihren Eigenschaften / Vererbung) . Ich hab glaub ich soweit alles in den Bausteinen umgesetzt, aber mir ist beim Kran und dem Stappel nicht klar, wie diese interagieren sollen.

Die Aufgabe sagt mir :
"Ein Containerstapel besteht aus keinem, einem, oder mehreren Containern und es ist egal wie viele Stappel es gibt bzw erzeugt werden". Aber mich verwirrt jetzt der Kran, denn der soll :
Mit Hilfe des Krans können Container von einem Ursprungsstapel zu einem Zielstapel bewegt werden. Wichtig ist, dass der Kran nur Containertransporte durchzuführen kann, die im Rahmen seiner Fähigkeiten liegen, d.h. unter Beachtung der maximalen Traglast und Hubhöhe. Auch ist der Kran nicht fähig, mehrere Container gleichzeitig zu transportieren. Der Containertransport geschieht in vier Schritten:
1. Positioniere Kran vor Ursprungsstapel
2. Entnehme obersten Container („pick“)
3. Positioniere Kran vor Zielstapel
4. Lege zuvor aufgenommenen Container zuoberst ab („place“)

Das alles klingt doch sehr nach einem Stack oder ? Ich bin im Moment soweit, dass ich das habe :
Code:
import java.util.ArrayList;
import java.util.List;

public class Stack<Container> {

    private int containerStackID;
    private static int firstContainerID = 0;
    private final List<Container> stackElements;

    public void createContainerStackID() {
        containerStackID = ++firstContainerID;
    }

    public int getContainerStackID() {
        return containerStackID;
    }

    public Stack() {
        createContainerStackID();
        stackElements = new ArrayList<>();
    }

    public void push(Container element) {
        stackElements.add(element);
    }

    public boolean isEmpty() {
        return stackElements.isEmpty();
    }

    public Container pop() {
        if (isEmpty()) {
            throw new EmptyStackException("Der Stack ist leer!");
        } else {
            int lastIndex = stackElements.size() - 1;
            Container lastElement = stackElements.get(lastIndex);
            stackElements.remove(lastIndex);
            return lastElement;
        }
    }

    @Override
    public String toString() {
        return "Stack [stackElements=" + stackElements + "]+ conatainerStackID ";
    }

    public void clear() {
        stackElements.clear();
    }

}
Hier dachte ich, dass es sich um den Containerstappel handelt, aber kann es sein, dass ich die Klasse gar nicht brauche, da der Kran diese ganzen Methoden braucht?

hier noch der Kran :
Code:
public class Kran {
    
    private Container40ft container40ft;
    private Container40ftHC container40ftHC;
    private static final int maxHeight = 2438; // 160 Fuß entsprechen 2438,4 cm
    private static final int maxloadCapacity = 30; // Tonnen

    public static int getMaxheight() {
        return maxHeight;
    }

    public static int getMaxloadcapacity() {
        return maxloadCapacity;
    }

}
 

Javinner

Top Contributor
dass der Kran nur Containertransporte durchzuführen kann, die im Rahmen seiner Fähigkeiten liegen, d.h. unter Beachtung der maximalen Traglast und Hubhöhe
Da es paar verschiedene Krans gibt, welche sich in Hubhöhe, Reichweite und Kraft unterscheiden, gilt es, diese Eigenschaften dem jeweiligen Kran zu "geben".
Eine Möglichkeit wäre es, ein Interface Kran mit Methoden wie
  • maxLiftPower() : double
  • maxLiftHight() : double
  • maxReach() : double
einzuführen und dann jede implementierende Klasse hart-codieren, wie du es bereits bei deinem Kran gemacht hast. Hat den Vorteil, dass jeweilige Klasse nur für sich geändert werden kann.
Java:
interface Crane
{
   public double maxLiftPower();
   public double maxLiftHight();
   public double maxReach();
}

class LittleCrane implements Crane
{
    private final double liftPower = 10;
    private final double liftHight = 10;
    private final double maxReach = 10;
   
    public double maxLiftPower()
    {
        return this.liftPower;
    }
    public double maxLiftHight()
    {
        return this.liftHight;
    }
    public double maxReach()
    {
        return this.maxReach;
    }

}
Man kann aber auch eine Klasse Kran erstellen, dabei ist eben die Gefahr vorhanden, dass falsche Werte an ein Kran übergeben werden können.
Java:
class Crane
{
    private final double liftPower;
    private final double liftHight ;
    private final double maxReach;

    Crane(double lift, double hight, double power)
    {
          //Werte übertragen
    }

    public double maxLiftPower()
    {
        return this.liftPower;
    }
    public double maxLiftHight()
    {
        return this.liftHight;
    }
    public double maxReach()
    {
        return this.maxReach;
    }
}
 

Noob1234_1234

Aktives Mitglied
Da es paar verschiedene Krans gibt, welche sich in Hubhöhe, Reichweite und Kraft unterscheiden, gilt es, diese Eigenschaften dem jeweiligen Kran zu "geben".
Eine Möglichkeit wäre es, ein Interface Kran mit Methoden wie
  • maxLiftPower() : double
  • maxLiftHight() : double
  • maxReach() : double
einzuführen und dann jede implementierende Klasse hart-codieren, wie du es bereits bei deinem Kran gemacht hast. Hat den Vorteil, dass jeweilige Klasse nur für sich geändert werden kann.
Java:
interface Crane
{
   public double maxLiftPower();
   public double maxLiftHight();
   public double maxReach();
}

class LittleCrane implements Crane
{
    private final double liftPower = 10;
    private final double liftHight = 10;
    private final double maxReach = 10;
  
    public double maxLiftPower()
    {
        return this.liftPower;
    }
    public double maxLiftHight()
    {
        return this.liftHight;
    }
    public double maxReach()
    {
        return this.maxReach;
    }

}
Man kann aber auch eine Klasse Kran erstellen, dabei ist eben die Gefahr vorhanden, dass falsche Werte an ein Kran übergeben werden können.
Java:
class Crane
{
    private final double liftPower;
    private final double liftHight ;
    private final double maxReach;

    Crane(double lift, double hight, double power)
    {
          //Werte übertragen
    }

    public double maxLiftPower()
    {
        return this.liftPower;
    }
    public double maxLiftHight()
    {
        return this.liftHight;
    }
    public double maxReach()
    {
        return this.maxReach;
    }
}

in der Aufgabe wird festgelegt, dass es nur einen Kran gibt und er hat die Fähigkeit entweder die Container vom Ursprungsstapel zu nehmen und zu einem Zielstappel zu bringen, aber wie leg ich das fest bzw wie setz ich diese Vorgaben um? Brauche ich eine Stappelklasse für die Container?(wenn ja welche datenstruktur nutzt sie und wie sieht sie aus) und vor allem wie setz ich es um, dass ich dem Kran 2 integer mitgebe und er automatisch, weiß, dass sich der erste Integerwert auf stappel 1 bezieht und der 2. wert eben auf den anderen Stappel ?
 

Noob1234_1234

Aktives Mitglied
Stack ist das englische Wort für Stapel :)
Damit wollte ich eigentlich erfragen, ob ich einen Stack als Datenstruktur nutzen sollte oder eben nicht, Wenn nicht, was dann ?

Mit Hilfe einer Methode, z. B. void transportContainer(Stapel origin, Stapel destination).
Aber wie sollte denn die Stappelklasse aussehen? Ist meine Umsetzung oben gut oder nicht gut. Ich hab ja im Prinzip nur quasi einen Stack für Container geschrieben oder nicht? Brauche ich jetzt noch zusätzlich eine Klasse mit Konstruktor für die Containerstappel
 

mihe7

Top Contributor
Nachtrag: wie ich gerade lese, wird es die Methode so nicht geben, da die Transportschritte einzeln durchzuführen sind.
 

Noob1234_1234

Aktives Mitglied
Nachtrag: wie ich gerade lese, wird es die Methode so nicht geben, da die Transportschritte einzeln durchzuführen sind.
Muss soweit ich weiß nicht, es gilt nur die Bedingungen zu beachten, dass der zu transportierende Container nicht schwerere als die Traglast des Krans ist und dass der Stapel nicht die Höhe des Krans überschreitet. Also müsste es doch so irgendwie aussehen oder ?
Java:
public class Kran {

    private Container40ft container40ft;
    private Container40ftHC container40ftHC;
    private static final int maxHeight = 2438; // 160 Fuß entsprechen 2438,4 cm
    private static final int maxloadCapacity = 30;

    public static int getMaxheight() {
        return maxHeight;
    }

    public static int getMaxloadcapacity() {
        return maxloadCapacity;
    }

    public static void transportContainer(Stack<Container> origin, Stack<Container> destination) {
        if (Kran.getMaxloadcapacity() > origin.getContainer.getWeight()) {
            Container origin = pop();
            destination.push(origin);
        }
    }

}
 

Noob1234_1234

Aktives Mitglied
Aber es bleibt immernoch die Frage wie ich die Containerstappelklasse implementiere, denn ich muss ja irgendwie an die Container kommen, um Zugriff auf deren Gewicht zu kriegen, aber wie mach ich das ?
 

mihe7

Top Contributor
Muss soweit ich weiß nicht, es gilt nur die Bedingungen zu beachten, dass der zu transportierende Container nicht schwerere als die Traglast des Krans ist und dass der Stapel nicht die Höhe des Krans überschreitet.
Das musst Du wissen. Ich habe nur gelesen:
Der Containertransport geschieht in vier Schritten:

Also, jetzt gehen wir mal zurück auf Anfang - ohne Code. Wie sieht denn Dein Modell im Diagramm aus?
 

temi

Top Contributor
Aber es bleibt immernoch die Frage wie ich die Containerstappelklasse implementiere, denn ich muss ja irgendwie an die Container kommen, um Zugriff auf deren Gewicht zu kriegen, aber wie mach ich das ?

Grob soll der Stapel der Aufgabe nach so aussehen:

Java:
public class Stapel {
 
    public Container pick() {
     
    }
 
    public void place(Container container) {
     
    }
}

Edit:

"pick()" und "place()" könnten allerdings auch Methoden des Kranes sein. Die Aufgabe, wie oben beschrieben, lässt es offen, wie die Methoden des Stapels heißen, um den obersten Container zu entfernen, bzw. hinzuzufügen.
 
Zuletzt bearbeitet:

Noob1234_1234

Aktives Mitglied
Das musst Du wissen. Ich habe nur gelesen:


Also, jetzt gehen wir mal zurück auf Anfang - ohne Code. Wie sieht denn Dein Modell im Diagramm aus?
Also die Modellierung ist eigentlich relativ simple :
Ein Container-Terminal besitzt genau einen fahrbaren Kran sowie einen oder mehrere
Containerstapel. Containerstapel sind beginnend mit 0 fortlaufend nummeriert; Integer genügt,
um die Stapelnummern darzustellen. Ein Containerstapel besteht aus keinem, einem, oder mehreren
Containern.
Für die Container gilt :
Man unterscheidet zwei Arten von Containern: 40-Fuß-Container (Kurzschreibweise: 40ft) sowie 40-Fuß-High-Cube-Container ( Kurzschreibweise: 40ftHC). Dabei bezeichnet 40 Fuß1 die Länge der Container. „High Cube“-Container sind höher im Vergleich zu regulären 40-Fuß-Containern. Erstere haben eine Höhe von 9 Fuß und 6 Zoll, letztere haben eine Höhe von nur 8
Fuß und 6 Zoll. Ein Container in unserem vereinfachten Modell besitzt neben seinem Typ folgende Eigenschaften: Länge, Höhe, Gewicht, sowie eine eindeutige Identifizierungsnummer. Das Gewicht beinhaltet das Eigengewicht des Containers sowie die im Container enthaltene Fracht. Breite und weitere Eigenschaften sollen vernachlässigt werden.

Ich denk mal bei den Containern kann man nicht viel falsch machen. Ich hab eine allgemeine Container Klasse und lasse die beiden speziellen Arten davon erben und statte sie mit einem Konstruktor jeweils aus, der ihnen eine int und ein gewicht mitgibt
 

Noob1234_1234

Aktives Mitglied
Grob soll der Stapel der Aufgabe nach so aussehen:

Java:
public class Stapel {

    public Container pick() {
    
    }

    public void place(Container container) {
    
    }
}

Edit:

"pick()" und "place()" könnten allerdings auch Methoden des Kranes sein. Die Aufgabe, wie oben beschrieben, lässt es offen, wie die Methoden des Stapels heißen, um den obersten Container zu entfernen, bzw. hinzuzufügen.
Braucht die ganze Klasse den Stack oder erstellt sich der Stack immer nur im Konstruktor bzw in lokalen Methoden?
 

Noob1234_1234

Aktives Mitglied
Grob soll der Stapel der Aufgabe nach so aussehen:

Java:
public class Stapel {

    public Container pick() {
    
    }

    public void place(Container container) {
    
    }
}

Edit:

"pick()" und "place()" könnten allerdings auch Methoden des Kranes sein. Die Aufgabe, wie oben beschrieben, lässt es offen, wie die Methoden des Stapels heißen, um den obersten Container zu entfernen, bzw. hinzuzufügen.
Weil beim placen der Container muss der Container ja durch irgendeine Datenstruktur gespeichert werden und das ist ja dann der Stack ?
 

Noob1234_1234

Aktives Mitglied
So in die Richtung sollte es dann gehen oder ?
Code:
ublic class ContainerStack {

    private Container40ft container40ft;
    private Container40ftHC container40ftHC;

    Stack<Container> stack = new Stack<>();

    public Container pick() {
        Container container = stack.pop();
        return container;
    }

    public void place(Container container) {
        stack.push(container);
    }

}
 

Noob1234_1234

Aktives Mitglied
Muss man hier alles selber machen?

Anhang anzeigen 12884

Hier fehlen noch Methoden. Wo und welche?

Wenn ich es richtig sehe, fehlen nur die Methoden vom Kran. Darf ich fragen, wie du dieses Diagramm erstellt hast ?
Der Kran muss doch auch Zugriff auf den Stapel haben oder ? Den der Kran muss die Container ja bewegen und wie gesagt er kann das nur wenn der Container nicht schwerer als seine Traglast ist. Mit der 2. Bedingung tue ich mir schwer. Ich denke man merkt, dass ich kein Muttersprachler in der deutschen Sprache bin. Aber vielleicht kann mir wer das erläutern:

"
Ein Kran besitzt eine maximale Hubhöhe. Das ist die Höhe, die ein theoretisch vollkommen flacher Gegenstand der Höhe 0 angehoben werden könnte. Die tatsächliche Hubhöhe muss um die Höhe des angehobenen Gegenstands vermindert werden. Beträgt die maximale Hubhöhe 80 Fuß, so ergibt sich für einen 10 Fuß hohen Container eine tatsächlich erreichbare Hubhöhe von 70 Fuß. Falls die tatsächlich erreichbare Hubhöhe geringer als die Höhe des Zielstapels ist, ist es dem Kran nicht möglich, den Container auf dem Zielstapel zu platzieren. Der Container wird in diesem Fall gar nicht erst vom Ursprungsstapel entnommen. Stellen Sie die maximale Hubhöhe des Krans unveränderlich auf 160 Fuß ein. " Die Einheiten hab ich umgerechnet in cm
 

Noob1234_1234

Aktives Mitglied
Code:
import java.util.Stack;

public class ContainerStack {

    private int containerStackID;
    private static int firstContainerID = 0;

    Stack<Container> stack = new Stack<>();

    public void createContainerStackID() {
        containerStackID = ++firstContainerID;
    }

    public int getContainerStackID() {
        return containerStackID;
    }

    public Container pick() {
        Container container = stack.pop();
        return container;
    }

    public void place(Container container) {
        stack.push(container);
    }

    public ContainerStack(Container container) {
        createContainerStackID();
        place(container);
    }
}

Ich glaube so kann die Stapel Klasse auch nicht stimmen oder ? Muss Im Konstruktor jedes Mal eine neuer stack erstellt werden oder passt es so ? Ich will ja am Ende mindestens 3 Stapel im TerminalContainer haben, auf denen man die Container ablegen kann. Also sollten es auch 3 unterschiedliche Stacks zum speichern sein, aber ich bin mir nicht sicher, ob meine Implementierung, das so gewährleistet
 

temi

Top Contributor
Ein Kran besitzt eine maximale Hubhöhe. Das ist die Höhe, die ein theoretisch vollkommen flacher Gegenstand der Höhe 0 angehoben werden könnte. Die tatsächliche Hubhöhe muss um die Höhe des angehobenen Gegenstands vermindert werden. Beträgt die maximale Hubhöhe 80 Fuß, so ergibt sich für einen 10 Fuß hohen Container eine tatsächlich erreichbare Hubhöhe von 70 Fuß. Falls die tatsächlich erreichbare Hubhöhe geringer als die Höhe des Zielstapels ist, ist es dem Kran nicht möglich, den Container auf dem Zielstapel zu platzieren. Der Container wird in diesem Fall gar nicht erst vom Ursprungsstapel entnommen. Stellen Sie die maximale Hubhöhe des Krans unveränderlich auf 160 Fuß ein. " Die Einheiten hab ich umgerechnet in cm

Was verstehst du denn daran nicht? Du musst halt vor dem Abladen/Absetzen prüfen, ob der Kran die Höhe des Stapels überhaupt erreichen kann.
 

Noob1234_1234

Aktives Mitglied
Code:
import java.util.Stack;

public class ContainerStack {

    private int containerStackID;
    private static int firstContainerID = 0;

    Stack<Container> stack = new Stack<>();

    public void createContainerStackID() {
        containerStackID = ++firstContainerID;
    }

    public int getContainerStackID() {
        return containerStackID;
    }

    public Container pick() {
        Container container = stack.pop();
        return container;
    }

    public void place(Container container) {
        stack.push(container);
    }

    public ContainerStack(Container container) {
        createContainerStackID();
        place(container);
    }
}

Ich glaube so kann die Stapel Klasse auch nicht stimmen oder ? Muss Im Konstruktor jedes Mal eine neuer stack erstellt werden oder passt es so ? Ich will ja am Ende mindestens 3 Stapel im TerminalContainer haben, auf denen man die Container ablegen kann. Also sollten es auch 3 unterschiedliche Stacks zum speichern sein, aber ich bin mir nicht sicher, ob meine Implementierung, das so gewährleistet

Und jetzt wo ich so darüber nachdenke, weiß ich auch net, ob die place methode in den Konstruktor gehört. Die Aufgabe gibt ja nicht her, ob schon stapel mit Containern vorhanden sind, aber es muss ja eigentlich so sein, denn der Kran oder das Terminal kann sie ja schließlich nicht herzaubern
 

temi

Top Contributor
Ich will ja am Ende mindestens 3 Stapel im TerminalContainer haben, auf denen man die Container ablegen kann.

Es ist ja nicht festgelegt, wieviele Containerstapel am ContainerTerminal stehen. Deshalb wirst du in ContainerTerminal auch eine flexible Möglichkeit benötigen mehrere Containerstapel zu haben. List<ContainerStack> würde sich da anbieten.

Da die Liste indexiert ist, könnte dieser Index auch gleich als Identifikation für die Stapel verwendet werden.
 

Noob1234_1234

Aktives Mitglied
Was verstehst du denn daran nicht? Du musst halt vor dem Abladen/Absetzen prüfen, ob der Kran die Höhe des Stapels überhaupt erreichen kann.
Also sollte ich in der Stapel klasse eine Methode haben, die die Größe des Stapels berechnet, um es zu vereinfachen ?

Aber in der Kran Klasse versteh ich dann nicht, wie ich denn über die Stappel auf die Container zugreifen kann
Java:
ublic class Crane {

    private static final int maxHeight = 2438; // 160 Fuß entsprechen 2438,4 cm
    private static final int maxloadCapacity = 30; // in Tonnen
    private ContainerStack containerstack;

    public static int getMaxheight() {
        return maxHeight;
    }

    public static int getMaxloadcapacity() {
        return maxloadCapacity;
    }

    public static void transportContainer(ContainerStack origin, ContainerStack destination) {
        if (Crane.getMaxloadcapacity() > origin.getContainer???? { // Wie greife ich auf die Container zu
            Container origin = origin.destination.push(origin);
        }
    }

}

Edit : Ich weiß inzwischen wie ich darauf zugreife, aber ich weiß nicht wie ich die Höhe vom Stappel bestimmen soll. Eigentlich hätte ich ja stack.size * Höhe gesagt, aber die Container haben keine einheitliche Höhe

Edit : Ich bin dumm und die Container haben eine einheitliche Größe. habs verwechselt mit der Länge
 
Zuletzt bearbeitet:

temi

Top Contributor
Aber in der Kran Klasse versteh ich dann nicht, wie ich denn über die Stappel auf die Container zugreifen kann

origin.pick() nimmt den obersten Container des Ursprungsstapels...

Edit: Allerdings hast du hier das Problem, dass du vor dem Nehmen prüfen musst, ob du den Container überhaupt nehmen kannst. Wir kennen die Aufgabe nicht. Gibt es genauere Angaben, welche Methoden der Stapel hat und wie sie benannt sind?
 

Noob1234_1234

Aktives Mitglied
Also ich glaube, dass ich soweit die Grundbausteine für die Modellierung habe. So sieht jetzt mein Kran aus(siehe unten), aber ich hab gerade in der Aufgabe weitergelesen, dass ich eine Textdatei mit 1. <Typ >;<Id >;< Gewicht >;< Stapel > und 2. <Ursprung >;< Ziel > schreiben muss. Der Path der Textdatei soll der Kommandozeile übergeben werden und jetzt hab ich das Problem, dass das Token <Ursprung > für die Ursprungsstapel-Numme steht und wieder eine positive int-Zahl inklusive 0 ist . Das Token <Ziel > steht für die Zielstapel-Nummer und ist wieder eine positive int-Zahl inklusive 0. Also werden der Methoden Zahlen übergeben und keine Container

Code:
public class Crane {

    private static final int maxHeight = 2438; // 160 Fuß entsprechen 2438,4 cm
    private static final int maxloadCapacity = 30; // in Tonnen

    public static int getMaxheight() {
        return maxHeight;
    }

    public static int getMaxloadcapacity() {
        return maxloadCapacity;
    }

    public static void transportContainer(ContainerStack origin , ContainerStack destination) {
        if (Crane.getMaxloadcapacity() >= origin.getContainerWeight()
                && Crane.getMaxheight() >= (Crane.getMaxheight() - destination.calculateContainerStackHeight())) {

            Container c = origin.pick();
            destination.place(c);
        }
    }
}
 

Noob1234_1234

Aktives Mitglied
Also ich bin wieder zurück und es gibt noch 2 Sachen bisher, die mich grundlegend irritieren. Also erstens soll der Kran zwei Zahlen (Integer entgegennehmen) und anhand von diesen die jeweiligen Stapel finden. Ich hab zwar in der Stapelklasse die Methode, die automatisch hochzählt wenn ein neuer Stapel erzeugt wird und entsprechend einen getter dafür, aber wie setz ich das im Kran um?

und seh ich es richtig, dass meine TerminalContainer Klasse die Hauptklasse inklusive main Methode ist ?
 

mihe7

Top Contributor
Poste doch mal die ganze Aufgabe, da fehlen mir zu viele Infos. Bislang haben wir ja nur ein grobes Modell, mir fehlt z. B., was zur Laufzeit überhaupt gemacht werden soll.
 

Noob1234_1234

Aktives Mitglied
Poste doch mal die ganze Aufgabe, da fehlen mir zu viele Infos. Bislang haben wir ja nur ein grobes Modell, mir fehlt z. B., was zur Laufzeit überhaupt gemacht werden soll.

Ihr Programm nimmt als erstes und einziges Kommandozeilenargument einen Pfad auf eine Textdatei entgegen. Verwenden Sie die Methode readFile der Klasse Terminal, um den Inhalt einer Datei zu lesen. Diese Methode hat als Rückgabewert ein String [], das die einzelnen Zeilen der Datei path enthält. Diese Datei beschreibt ein Container-Terminal wie beispielsweise in Abb. 0.1 dargestellt. Diese Datei besteht aus zwei Bereichen. Der erste Bereich beschreibt den initialen Aufbau eines Container-
Terminals. Der zweite Bereich beschreibt Containertransporte, die der Kran, ausgehend von dem initialen Aufbau, ausführen soll. Beide Bereiche sind durch eine Zeile mit dem Inhalt -- voneinander separiert. Hierbei können Sie nicht davon ausgehen, dass gegebene Eingabedateien immer genau nach den gegebenen Spezifikationen aufgebaut sind, folglich müssen Sie diese sowohl auf Semantik- als auchauf Syntaxfehler überprüfen. Eingabedateien, welche gegen die Spezifikation für Container und das Terminal verstoßen oder nicht nach untenstehender Syntaxspezifikation aufgebaut sind, führen zum Beenden des Programms, nachdem eine passende Fehlermeldung ausgegeben wurde. (Also hier muss ich die Eingabedateien irgendwie mit regex matcher und pattern überprüfen oder? )

Der erste Bereich enthält beliebig viele Zeilen. Jede Zeile beschreibt einen Container und seinen Lagerort. Befinden sich zwei Container im selben Containerstapel, liegt der Container mit kleinerer Zeilennummer unter dem Container mit größerer Zeilennummer. Jede Zeile ist folgendermaßen aufgebaut:
<Typ >;<Id >;< Gewicht >;< Stapel >
Das Token <Typ > steht für den Containertyp und ist dabei entweder 40 ft oder 40 ftHC. Das Token <Id > steht für Container-Id und ist eine positive int-Zahl. Das Token <Gewicht > steht für das Containergewicht und ist eine positive int-Zahl. Das Token <Stapel >steht für die Containerstapel-Nummer und ist eine positive int-Zahl inklusive 0. (Für den Typ ein Enum? aber wie geht das mit Zahlen?)

Der zweite Bereich enthält beliebig viele Zeilen. Jede Zeile beschreibt einen Containertransport des Krans, bestehend aus den vier Teilschritten (1) positionieren vor Ursprungsstapel, (2) aufnehmen, (3) positionieren vor Zielstapel, (4) ablegen. Jede Zeile ist folgendermaßen aufgebaut:
<Ursprung >;< Ziel >
Das Token <Ursprung > steht für die Ursprungsstapel-Nummer und ist wieder eine positive int-Zahl inklusive 0. Das Token <Ziel > steht für die Zielstapel-Nummer und ist wieder eine positive int-Zahl inklusive 0. (Hier habe ich das Problem mit den Zahlen)

Wie soll die Terminalklasse denn aussehen, ich hab es gerade versucht, aber ich hab wirklich keine Ahnung. Auf jeden Fall besitzt diese Klasse ja einen Kran und den habe ich instanziert, aber wie ich mit den Stappeln weiter vorgehen soll weiß ich nicht
 

Noob1234_1234

Aktives Mitglied
Code:
import java.util.Stack;

public class ContainerStack {

    private Container container;
    private int containerStackID;
    private static int firstContainerID = 0;
    private int ContainerStackHeight;

    Stack<Container> stack = new Stack<>();

    public int calculateContainerStackHeight() {
        ContainerStackHeight = stack.size() * 1219;
        return ContainerStackHeight;
    }

    public int getContainerWeight() {
        return container.getWeight();
    }

    public ContainerTyp getConTainerTyp() {
        return container.getContainertyp();
    }

    public void createContainerStackID() {
        containerStackID = ++firstContainerID;
    }

    public int getContainerStackID() {
        return containerStackID;
    }

    public Container pick() {
        Container container = stack.pop();
        return container;
    }

    public void place(Container container) {
        stack.push(container);
    }

    public ContainerStack(Container container) {
        createContainerStackID();
        place(container);
    }

    public String toString() {
        return String.format("%s;%s;%s;%s", container.getContainertyp(), container.getId(), container.getWeight(),
                containerStackID);
    }

    public static void main(String[] args) {
        ContainerStack cs = new ContainerStack(new Container40ft(ContainerTyp.A, 1, 1));
        ContainerStack cs1 = new ContainerStack(new Container40ft(ContainerTyp.B, 1, 1));
        System.out.println(cs);
        //System.out.println(cs1);
    }
}
Ich bekomme beim testen der toString eine NullpointerException, aber wieso?

Hier die ContainerKlasse
Code:
public class Container {
    protected int length;
    protected static final int height = 1219; // in Fuß (umgerechent = 1219,2)
    protected int id;
    protected int weight;
    protected ContainerTyp containertyp;

    public int getLength() {
        return length;
    }

    public void setLength(int length) {
        this.length = length;
    }

    public static int getHeight() {
        return height;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }

    public ContainerTyp getContainertyp() {
        return containertyp;
    }

}

Und hier die 2 Klassen, die erben
1.
Code:
public class Container40ft extends Container {
    private static final int lenght = 259; // 8 Fuß 6 Zoll sind umgerechnet 259.08 cm
    private final ContainerTyp containertyp;

    Container40ft(ContainerTyp container, int id, int weight) {
        this.containertyp = container;
        super.id = id;
        super.weight = weight;
    }

    public int getLenght40ft() {
        return lenght;
    }

}

2.
public class Container40ftHC extends Container {
private static final int lenght = 289; // 9 Fuß 6 Zoll sind umgerechent ca 289.56 cm
private ContainerTyp containertyp;

Container40ftHC(ContainerTyp containertyp, int id, int weight) {
this.containertyp = containertyp;
super.id = id;
super.weight = weight;
}

public int getLenght40ftHC() {
return lenght;
}
}

Ich erstelle doch oben bei der test main methode einen neuen Container und will diesen printen. In den 2 erbenden Containern selbst werden doch die Werte, die mitgegeben werden, in der allgemeinen Container Klasse gespeichert (durch den Aufruf super.), aber wieso klappt das nicht ? Ich krieg eine Nullpointer
 

Noob1234_1234

Aktives Mitglied
Aha, mit #45 wird endlich ein Schuh draus.


Ja, was soll denn container sein?
in dem Fall war es ein Enum, dass aus nur 40ft und 40ftHC besteht, aber das mit dem Enum klappt irgendwie nicht und ich bin seit stunden am Testen und bin mir sicher, dass meine Datenkapselung scheiße ist. Wie greif ich in meiner Modellierung bitte auf die entsprechenden Attribute der anderen Klassen zu ?

Am Bsp kran und Stapel: So funktioniert die Methode, aber so wie oben mit den Bedingugen, die eigentlich auf die Werte von Container greifen sollten, klappt es nicht? Was mach ich falsch bei der Datenkapselung

Code:
public void transportContainer(ContainerStack origin, ContainerStack destination) {

            Container c = origin.pick();
            destination.place(c);
        }
 

Noob1234_1234

Aktives Mitglied
Wo ist mein Denkfehler bei der Datenkapselung ? Wie greife ich in meiner Crane Klasse auf Attribute von ContainerStack zu ? Das ist nicht das erste Mal, dass ich diesen Fehler habe, aber ich checke net wo das Basisproblem liegt

Code:
public class Crane {

    private static final int maxHeight = 2438; // 160 Fuß entsprechen 2438,4 cm
    private static final int maxloadCapacity = 30; // in Tonnen
    private ContainerStack origin;
    private ContainerStack destination;

    public static int getMaxheight() {
        return maxHeight;
    }

    public static int getMaxloadcapacity() {
        return maxloadCapacity;
    }

    public void transportContainer(int number, int secondNumber) {
        if (origin.getContainerStackID() == number && destination.getContainerStackID() == secondNumber) {

            /*if (Crane.getMaxloadcapacity() >= origin.getContainerWeight()

                    && Crane.getMaxheight() >= (Crane.getMaxheight() - destination.calculateContainerStackHeight())) {*/

                Container c = origin.pick();
                destination.place(c);
            }
        }
    }
//}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Arbeitszeit / Zeiterfassung - Gedanken und Modellierung Java Basics - Anfänger-Themen 122
L Modellierung Widerstandsnetzwerk Java Basics - Anfänger-Themen 15
M Problem in der Modellierung Java Basics - Anfänger-Themen 20
D Verständnisfrage zur Modellierung einer HDD Java Basics - Anfänger-Themen 17
F OO - Modellierung Java Basics - Anfänger-Themen 24
S Modellierung von Karteneffekten ähnlich YUGIOH Java Basics - Anfänger-Themen 2
1 Modellierung eines Bankkunden Java Basics - Anfänger-Themen 6
N Modellierung eines Programms in UML (Klassendiagramm) Java Basics - Anfänger-Themen 2
B Klassen Modellierung einer Kneipe Java Basics - Anfänger-Themen 86
A Modellierung Java Basics - Anfänger-Themen 8
M Modellierung eines trivialen Web-Shops Java Basics - Anfänger-Themen 12
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
M Vererbung - Polymorphie Java Basics - Anfänger-Themen 37
L Java- Vererbung Java Basics - Anfänger-Themen 4
ineedhelpinjava Vererbung Java Basics - Anfänger-Themen 12
ineedhelpinjava Vererbung Java Basics - Anfänger-Themen 1
I JSON / XML Struktur mit Vererbung / Interfaces Java Basics - Anfänger-Themen 0
M Interface oder Vererbung? Java Basics - Anfänger-Themen 12
M Vererbung Java Basics - Anfänger-Themen 6
M Designentscheidung von Attributen/Methoden im Falle von Vererbung Java Basics - Anfänger-Themen 8
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
A Methoden Vererbung und Interface Java Basics - Anfänger-Themen 14
D Klassen und Vererbung Java Basics - Anfänger-Themen 2
U Vererbung Java Basics - Anfänger-Themen 7
D Vererbung Java Basics - Anfänger-Themen 3
K Schleife berechnet kein Ergebnis (Vererbung) Java Basics - Anfänger-Themen 6
00111010101 Objektorientiertes Programmieren mit Vererbung (Zahlen in Array verschwinden) Java Basics - Anfänger-Themen 3
W Zur Vererbung: Wann und wie? Java Basics - Anfänger-Themen 35
H Datenkapselung, Vererbung und UML Java Basics - Anfänger-Themen 16
districon Super-Stichwort/ Vererbung Java Basics - Anfänger-Themen 3
YaU Vererbung erstellt NullPointerException? Java Basics - Anfänger-Themen 4
1 Vererbung Klassenattribute Java Basics - Anfänger-Themen 9
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
N Thema Vererbung Java Basics - Anfänger-Themen 31
A Vererbung Vererbung Übung Java Basics - Anfänger-Themen 5
B Vererbung - Sichtbarkeitsmodifikation - protected Java Basics - Anfänger-Themen 10
B Best Practice Unschlüssig ob Vererbung oder Interface Java Basics - Anfänger-Themen 2
G Java Vererbung Java Basics - Anfänger-Themen 8
Y Vererbung Konto - Anfangsprobleme Java Basics - Anfänger-Themen 7
A Vererbung Klassen im Bezug auf Auto´s Java Basics - Anfänger-Themen 18
A Klassen Vererbung und zusätzliche Unterklassen Java Basics - Anfänger-Themen 23
M Vererbung mit Enums Java Basics - Anfänger-Themen 8
Kirby.exe Vererbung im Detail erklärt? Java Basics - Anfänger-Themen 9
M Fehlendes Verständnis für dynamische Bindung und Vererbung Java Basics - Anfänger-Themen 13
W OOP Vererbung im Computerspiel Java Basics - Anfänger-Themen 7
J Probleme mit Vererbung Java Basics - Anfänger-Themen 4
I Vererbung Java Basics - Anfänger-Themen 13
W OOP Vererbung und Problem bei Zählschleife in einer Methode Java Basics - Anfänger-Themen 10
W Methoden Verständnisfrage Vererbung von Methoden Java Basics - Anfänger-Themen 14
V Vererbung Java Basics - Anfänger-Themen 2
J Frage zur Vererbung Java Basics - Anfänger-Themen 1
J Vererbung Java Basics - Anfänger-Themen 3
U Was löst meine NullPointerException aus? (Vererbung) Java Basics - Anfänger-Themen 12
O Vererbung Ueben mit kleiner Datenstruktur von Räumen Java Basics - Anfänger-Themen 10
O Umgang mit Vererbung verstehen Java Basics - Anfänger-Themen 4
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
O Vererbung änderung des Konstruktors Java Basics - Anfänger-Themen 8
L Vererbung Java Basics - Anfänger-Themen 5
E HashMap+Vererbung Java Basics - Anfänger-Themen 11
E Vererbung super-Methoden Aufruf Java Basics - Anfänger-Themen 3
B Java Vererbung Fragen (zu Code Beispiel) Java Basics - Anfänger-Themen 3
A Objekterstellung bei der Vererbung Java Basics - Anfänger-Themen 7
P Vererbung Warum funktioniert die Vererbung hier nicht Java Basics - Anfänger-Themen 14
S Vererbung Java mehrfach Java Basics - Anfänger-Themen 10
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
A Klassen Vererbung privater Methoden und Member Java Basics - Anfänger-Themen 12
A Konstruktoren Vererbung Java Basics - Anfänger-Themen 3
ReinerCoder Vererbung von JFrame in einer Klasse entfernen Java Basics - Anfänger-Themen 5
W Vererbung, abstract und Konstruktoren Java Basics - Anfänger-Themen 30
J Vererbung und Methodenaufruf Java Basics - Anfänger-Themen 11
G Polymorphie, Vererbung, statischer Typ, Laufzeittyp Java Basics - Anfänger-Themen 2
H Vererbung mit private instanzvariablen Java Basics - Anfänger-Themen 9
S Vererbung Funktionsweise Code zur Vererbung Java Basics - Anfänger-Themen 1
C Methoden Vererbung private Attribute/public Methoden Java Basics - Anfänger-Themen 4
S Verständnis Vererbung Java Basics - Anfänger-Themen 3
D JavaFX Vererbung Java Basics - Anfänger-Themen 2
U Vererbung Generizität und Vererbung Java Basics - Anfänger-Themen 4
A Vererbung bei Klassen mit Objekt der Klasse im Konstruktor Java Basics - Anfänger-Themen 4
K Vererbung Octagon von Circle Java Basics - Anfänger-Themen 0
B Hilfe bei Vererbung Java Basics - Anfänger-Themen 2
D Vererbung Frage zum Klassenaufbau mit Vererbung Java Basics - Anfänger-Themen 1
T Vererbung und interface. Java Basics - Anfänger-Themen 1
S Gehaltsberechnung (Vererbung, abstrakte Methoden) Java Basics - Anfänger-Themen 6
S Vererbung Java Basics - Anfänger-Themen 1
F Vererbung in zwei Richtungen? Java Basics - Anfänger-Themen 14
D Vererbung / Polymorphie Java Basics - Anfänger-Themen 5
O Vererbung Java Basics - Anfänger-Themen 5
MiMa Vererbung Theorie OK, Praxis ?? Java Basics - Anfänger-Themen 4
Arif Vererbung Vererbung Variablen überschreiben Java Basics - Anfänger-Themen 1
C Vererbung - Ausgaben bestimmen Java Basics - Anfänger-Themen 6
S Vererbung Java Basics - Anfänger-Themen 10
L Setter und Getter/Vererbung Java Basics - Anfänger-Themen 6
C Konstruktoren und Vererbung Java Basics - Anfänger-Themen 2
J Kleinere Frage zur Vererbung/Objekterzeugung Java Basics - Anfänger-Themen 2
G Vererbung Java Basics - Anfänger-Themen 12
J Vererbung privater Variablen Java Basics - Anfänger-Themen 7
J Vererbung Vererbung von Methoden Java Basics - Anfänger-Themen 6
B Vererbung Java Basics - Anfänger-Themen 12
K Vererbung (super) Java Basics - Anfänger-Themen 2
A ArrayQueue mit Exceptions und Vererbung Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben