Modellierung, vererbung,

Diskutiere Modellierung, vererbung, im Java Basics - Anfänger-Themen Bereich.
N

Noob1234_1234

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);
        }
    }
}
 
N

Noob1234_1234

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

mihe7

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.
 
N

Noob1234_1234

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
 
N

Noob1234_1234

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
 
N

Noob1234_1234

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);
        }
 
N

Noob1234_1234

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);
            }
        }
    }
//}
 
N

Noob1234_1234

Nein, nicht Container :) Ich wollte wissen, was container denn sein soll:

container dürfte null sein -> NullPointerException.
Hab jetzt die ganzen Attribute und Methoden static deklariert und jetzt wird zumindest das richtige ausgegeben ohne Fehler. Aber ich krieg die eine Kran Methode nicht hin. Kann mir bitte wer zeigen, wie ich der Methode 2 Ganzzahlen geben kann, sodass sie dann automatisch ermitteln kann, um welche Stapel es sich handelt? Ich sitze echt schon den ganzen Tag hier dran und hab kb mehr. Aber ich bin glaub ich kurz davor. Nur diese Methode macht mich kaputt
 
N

Noob1234_1234

Dafür brauch ich doch bestimmt eine Hilfsmethode, aber wie ???
 
mrBrown

mrBrown

Hab jetzt die ganzen Attribute und Methoden static deklariert und jetzt wird zumindest das richtige ausgegeben ohne Fehler.
Das solltest du direkt wieder rückgängig machen, das ist genau der falsche Weg :)
Also erstens soll der Kran zwei Zahlen (Integer entgegennehmen) und anhand von diesen die jeweiligen Stapel finden.
wo kommt denn zB diese Info her? In der Aufgabenstellung oben steht dazu nichts
 
N

Noob1234_1234

Das solltest du direkt wieder rückgängig machen, das ist genau der falsche Weg :)

Was ist denn dann der richtige Weg? Ich hab mich den ganzen Tag damit beschäftigt und mich überall eingelesen. Ich find nichts. Bitte sag mir, wenn du was weißt

wo kommt denn zB diese Info her? In der Aufgabenstellung oben steht dazu nichts
Aufgabe : Ich muss eine Textdatei einlesen und in der steht das
<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. Aber wie greift mein Kran auf die Stapelnummer von meinen Stapeln zu ?
 
mrBrown

mrBrown

Nur weil in einer Textdatei zwei Zahlen stehen, heißt das nicht, dass dein Modell eine Methode besitzen muss, die genau diese beiden Zahlen bekommt.


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“)
Dieses (Falls Teil der Aufgabenstellung) würde ich zumindest anders interpretieren.

Ich würde 1-4 genau so in Terminal erwarten, in Pseudocode etwa:
Code:
kran.positioniereVor(ursprungsstapel)
kran.pick()
kran.positioniereVor(zielstapel)
kran.place()
 
N

Noob1234_1234

Nur weil in einer Textdatei zwei Zahlen stehen, heißt das nicht, dass dein Modell eine Methode besitzen muss, die genau diese beiden Zahlen bekommt.



Dieses (Falls Teil der Aufgabenstellung) würde ich zumindest anders interpretieren.

Ich würde 1-4 genau so in Terminal erwarten, in Pseudocode etwa:
Code:
kran.positioniereVor(ursprungsstapel)
kran.pick()
kran.positioniereVor(zielstapel)
kran.place()
Ich hab aber trotzdem noch das Problem mit dem Zugriff auf andere Klassen. Ich weiß ich stell mich in euren Aufgaben sehr dumm an, aber wie greift dann meine ContainerStack Klasse auf die Inhalte, gespeicherten Werte etc der Container zu ?
Wie greift mein Kran auf die ContainerStackKlasse zu und kann zum bso die getContainerNumber in der Kran klasse aufrufen?
Genau das ist doch mein grundlegendes Problem. Ich steh absolut auf dem Schlauch und nichts will mehr klappen, aber danke dir schon mal. Dann muss ich den Transport Vorgang doch nicht in einem machen, aber kann mir bittr wer mein grundlegendes Problem lösen?
 
N

Noob1234_1234

Nur weil in einer Textdatei zwei Zahlen stehen, heißt das nicht, dass dein Modell eine Methode besitzen muss, die genau diese beiden Zahlen bekommt.
Aber die Zahlen die später in der Textdatei stehen, werden übergeben. Die 1. Positioniert den kran auf den stapel, dann wird das oberste gepickt und dsnn wird der Kran auf die 2. Zahl(anderer stapel) gesetzt . Weiß nicht ob das deine Absicht war, aber du hast mich auf eine Idee gebracht. Kann es sein, dass ich dem Kran ein Attribut "Position" mit settern/gettern geben muss und dem Konstruktor diese Position mitgeben muss?
 
Zuletzt bearbeitet von einem Moderator:
mrBrown

mrBrown

Aber die Zahlen die später in der Textdatei stehen, werden übergeben. Die 1. Positioniert den kran auf den stapel, dann wird das oberste gepickt und dsnn wird der Kran auf die 2. Zahl(anderer stapel) gesetzt .
Und? Nur weil die irgendwo benutzt werden müssen, muss der Kran die trotzdem nicht kennen :)

Weiß nicht ob das deine Absicht war, aber du hast mich auf eine Idee gebracht.
Dich auf eine Idee zu bringen war Absicht :)

Kann es sein, dass ich dem Kran ein Attribut "Position" mit settern/gettern geben muss und dem Konstruktor diese Position mitgeben muss?
Würde ich zumindest machen, wobei man da am Konstruktor nichts machen muss (außer du möchtest modellieren, dass ein neuer Kran für jeden Stapel gebeut werden soll)
 
N

Noob1234_1234

Und? Nur weil die irgendwo benutzt werden müssen, muss der Kran die trotzdem nicht kennen :)
Wieso nicht ? Das ist der Part den Ich nicht kapiere ? Der Kran muss doch überprüfen, ob die Zahl die er bekommt zu einem Stapel gehört? Bzw er muss doch auf den Inhalt von der Containerklasse zugreifen ? Weil ich will im Kran in der methode irgendwo durch den Stack iterrieren um die mitgegebene int nummer mit stack.getContainerStackNumber zu vergleichen ? Wenn sie da ist muss die Position des Krans doch auf die bestätigte zahl setzen oder nicht? Oder passiert das alles erst in der TerminalContainer klasse? Aber dann ist mir imemrnoch nicht klar, wie die Methoden für den Kran aussehen ? Passieren die ganzen Überprüfungen im Kran selbst oder im Terminal?????

Dich auf eine Idee zu bringen war Absicht :)


Würde ich zumindest machen, wobei man da am Konstruktor nichts machen muss (außer du möchtest modellieren, dass ein neuer Kran für jeden Stapel gebeut werden soll)
Ne ne die Aufgabe gibt vor, dass es nur einen Kran für das Terminal gibt. Dem Konstruktor hätte ich eh nur die position mitgegeben, damit man den Kran im Terminal ein mal beliebig positioniert und halt dann den einen Kran auf die Positionen stellt.
 
Zuletzt bearbeitet von einem Moderator:
Thema: 

Modellierung, vererbung,

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben