Schacht + Halterung

PhilBauing

Mitglied
Guten Abend,

ich habe ein Problem mit der Verarbeitung von Daten in meinem Programm.

Ich habe ein Objekt Schacht:

[Java]
package rohrnetz;

public class Schacht {

private double xKoordinate;
private double yKoordinate;
private double zKoordinate;
private double durchmesser;
private double tiefe;
private double zulaufmenge;


public Schacht(double xKoordinate, double yKoordinate, double zKoordinate,
double durchmesser, double tiefe, double zulaufmenge) {
this.xKoordinate = xKoordinate;
this.yKoordinate = yKoordinate;
this.zKoordinate = zKoordinate;
this.durchmesser = durchmesser;
this.tiefe = tiefe;
this.zulaufmenge = zulaufmenge;
}

public double getxKoordinate() {
return xKoordinate;
}

public void setxKoordinate(double xKoordinate) {
this.xKoordinate = xKoordinate;
}

public double getyKoordinate() {
return yKoordinate;
}

public void setyKoordinate(double yKoordinate) {
this.yKoordinate = yKoordinate;
}

public double getzKoordinate() {
return zKoordinate;
}

public void setzKoordinate(double zKoordinate) {
this.zKoordinate = zKoordinate;
}

public double getDurchmesser() {
return durchmesser;
}

public void setDurchmesser(double durchmesser) {
this.durchmesser = durchmesser;
}

public double getTiefe() {
return tiefe;
}

public void setTiefe(double tiefe) {
this.tiefe = tiefe;
}

public double getZulaufmenge() {
return zulaufmenge;
}

public void setZulaufmenge(double zulaufmenge) {
this.zulaufmenge = zulaufmenge;
}

}[/Java]

Ein Objekt Haltung:

[Java]
package rohrnetz;

public class Haltung {
private double durchmesser;
private int anfangsschacht;
private int endschacht;
private double xKoordinate;
private double yKoordinate;
private double zKoordinate;

Rohrnetz rohrnetz = new Rohrnetz();

public Haltung(double durchmesser, int anfangsschacht, int endschacht) {
this.durchmesser = durchmesser;
this.anfangsschacht = anfangsschacht;
this.endschacht = endschacht;
this.xKoordinate = endschacht;
}

public double getDurchmesser() {
return durchmesser;
}

public int getAnfangschacht() {
return anfangsschacht;
}

public int getEndschacht() {
return endschacht;

}

public double getxKoordinate() {

return xKoordinate;
}

public void setxKoordinate(double xKoordinate, int index) {

this.xKoordinate = xKoordinate;
}

public double getyKoordinate() {
return yKoordinate;
}

public void setyKoordinate(double yKoordinate) {
this.yKoordinate = yKoordinate;
}

public double getzKoordinate() {
return zKoordinate;
}

public void setzKoordinate(double zKoordinate) {
this.zKoordinate = zKoordinate;
}

}[/Java]

Und in dieser Klasse werden 2 ArrayListen erzeugt, welche die Objekte (Haltung/Schacht) beinhalten.

[Java]
package rohrnetz;

import java.util.ArrayList;

public class Rohrnetz {

private ArrayList<Schacht> schaechte;

private ArrayList<Haltung> haltungen;

public Rohrnetz() {
schaechte = new ArrayList<Schacht>();
haltungen = new ArrayList<Haltung>();

}

// Haltungen bzw Schächte den jeweiligen ArrayListen zufügen.
public void neuerSchacht(Schacht schacht) {
this.schaechte.add(schacht);
}

public void neueHaltung(Haltung haltung) {
this.haltungen.add(haltung);

}

// summiert die Zulaufmengen aller Schächte.

public static double getGesamtZulaufmenge(ArrayList<Schacht> schaechte) {
ArrayList<Schacht> schachtliste = schaechte;
double summe = 0;
for (int index = 0; index < schaechte.size(); index++) {
Schacht aktuellerschacht = new Schacht(0, 0, 0, 0, 0, 0);
aktuellerschacht = (Schacht) schachtliste.get(index);
double zulaufmenge = aktuellerschacht.getZulaufmenge();
summe += zulaufmenge;

}

return summe;

}

public ArrayList<Schacht> getSchaechte() {
return schaechte;
}

public void setSchaechte(ArrayList<Schacht> schaechte) {
this.schaechte = schaechte;
}

public ArrayList<Haltung> getHaltungen() {
return haltungen;
}

public void setHaltungen(ArrayList<Haltung> haltungen) {
this.haltungen = haltungen;
}

} [/Java]

Wie ihr seht, wird im Konstruktor der Haltungen nur der Durchmesser, der Anfangs- und der Endschacht bestimmt. Da eine Haltung, zwei Schächte am unteren Ende miteinander verbindet, möchte ich z.B. die Koordinaten der ArrayList schaechte auslesen (Hier liegt nicht das Problem) und diese effektiv irgendwo speichern. Mit effektiv meine ich, dass sie nachher wieder leicht zugänglich sind.

Ich glaube, dass es am sinnvollsten wäre, die ArrayList haltungen zu clonen und zu erweitern, im Sinne von, vorher sieht das Objekt in der ArrayList so aus: (durchmesser, anfangsschacht, endschacht) und nachher so: (durchmesser, anfangsschacht, endschacht, x, y, z).
Ist das überhaupt möglich?

Außerdem habe ich überlegt, ob man vielleicht das Objekt Haltung selber zu einer ArrayList machen sollte um dann irgendwie eine Methode zu schreiben mit der man nachher über "add." neue Elemnte zur inneren ArrayList hinzufügt?

Zu guter letzt, würde ich es glaube ich schaffen eine neue ArrayList oder Array anzulegen, welche dann über den dazugehörigen Index die richtigen Koordinaten zugewiesen bekommt. Irgendwie empfinde ich diese Variante als unelegant gelöst, da ich dadurch (Es gibt ja mehr als eine Koordinate die ausgelesen werden muss) etliche neue ArrayListen im Code unterkriegen müsste.

Könnt ihr mir vielleicht einen Denkanstoß geben??

Grüße
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
Ich glaube, dass es am sinnvollsten wäre, die ArrayList haltungen zu clonen und zu erweitern, im Sinne von, vorher sieht das Objekt in der ArrayList so aus: (durchmesser, anfangsschacht, endschacht) und nachher so: (durchmesser, anfangsschacht, endschacht, x, y, z).
Ist das überhaupt möglich?
du kannst eine Liste mit Objekten durchlaufen und dabei diese Objekte ändern, oder die Objekte in eine neue Liste einfügen
oder zu jedem Objekt ein neues erzeugen und diese einfügen,
da ist nichts dabei, das passiert jeden Tage,
mit Liste klonen/ erweitern hat das begrenzt zu tun, eher mir normaler Arbeit
 

PhilBauing

Mitglied
Danke für deine Antwort.
Es wäre super, wenn du mir sagen könntes wo ich deinen Lösungsansatz nachlesen kann? Hört sich perfekt an für das was ich brauch.

Bei versuchen die ArrayList zu erweitern (ich hab irgendwie rumprobiert) sind die ganze Zeit Konstruktorfehler entstanden. Ich weiß, dass ich einen zweiten Konstruktor bauen kann, der andere Eingaben erwartet als der andere.



Viele Grüße
 
S

SlaterB

Gast
es gibt nichts nachzulesen, weil es kein spezielles Problem ist, normale Arbeit wird nirgendwo beschrieben,
allgemein Schleifen und allgemein ArrayList haben natürlich ihre Kapitel, aber dürftest zu kennen,

poste doch deine Programme wenn du irgendwo Probleme siehst,
> ich hab irgendwie rumprobiert
+
> sind die ganze Zeit Konstruktorfehler entstanden
klingen ja nach irgendwas
 

PhilBauing

Mitglied
Ich weiß nicht, ob ich auf dem richtigen Weg bin, aber ich habe jetzt ganz einfach eine for-Schleife in meine Rohrnetzklasse eingebaut.

[Java]{
for (int i = 0; i < haltungen.size(); i++) {
haltungen.add(i, schaechte.get(i).getxKoordinate());
}
} [/code]

Ich bekomme das ".add" als Fehler angezeigt, mit den Änderungsvorschlägen "addAll" (Diese Änderung bewirkt nichts) und "Change return Type of 'getxKoordinate()' to 'Haltung' ".
Wenn ich letzteres mache, kann ich die Variable 'xKoordinate' in meiner Schachtklasse nicht mehr so verwenden wie ich es eigentlich wollte, da der Konstruktor an der Stelle xKoordinate ein Argument vom Typ Haltung erwartet.

Könnt ihr mir sagen wo mein Fehler ist?

Viele Grüße
 

HimBromBeere

Top Contributor
Ich würde nochmal wissen wollen, warum genau du die Koordinaten der Schächte nochmal in den Haltungen haben willst. Zu jeder Haltung gehören doch min. 2 Schächte, oder? Un die haben Koordinaten, sie brauchste dann doch nicht nochmal in den Haltungen speichern. Leg dir zu jeder Haltung doch einfach eine Liste der Schächte an, die sie verbindet, dann bekommste die Koordinaten gleich mit.

[EDIT]Hab mal versucht, dein Problem zu verbildlichen. Korrigier mich, wenn ich mit meinen Vermutungen daneben liege.[/EDIT]
 

Anhänge

  • Haltungen.jpg
    Haltungen.jpg
    6 KB · Aufrufe: 24
Zuletzt bearbeitet:
S

SlaterB

Gast
> Könnt ihr mir sagen wo mein Fehler ist?
den Fehler muss man ja in 72 Stunden am PC am Stück oder sonstige ernsthafte Gehirnschäden vermuten (sorry ;) )

Ruhe bewahren, Denken, einen Plan haben, nicht so viel auf einmal programmieren,

in Zeile 3 hast du 6 runde Klammern,
vielleicht wäre es schon von Vorteil, dir für alle Zeilen außer for-Schleifen oder ifs mehr als 2 runde Klammern auf einmal (möglichst) zu verbieten..

was willst du überhaupt machen?
du durchläufst die Liste haltungen, also willst du wohl etwas mit dem jeweils i-ten Objekt machen?
ein add() wird kein vorhandenes Objekt modifizieren, falls du das denkst

ob du das denkst kann man nicht wissen, denn du hälst es nicht für nötig, deine Gedanken auch aufzuschreiben,
zumindest nicht hier direkt zum Code, man darf raten und raten,

> Haltung h = haltungen.get(i);
wäre eine vielleicht sinnvolle Zeile hier, mir nur 2 runden Klammern,

schaechte.get(i) brauchst du anscheinend auch, wollen wir dieses Objekt holen, mir nur 2 runden Klammern:
> Schaltung s = schaechte.get(i);
bevor bald zu viele Klammen zu riskieren sind, gleich auch die x-Koordinate raus:
> int x = s.getxKoordinate()

was soll nun passieren?
willst du das vorhandene h ändern?
> h.setX(x); // 2 Klammern!

willst du ein neues Halterung erstellen?
> Halterung h2 = new Halterung(h, x); // 2 Klammern!

wenn h in der Liste bleiben soll wie zuvor, dann mit der Liste nix mehr zu machen,
wenn ein neues Objekt einzufügen ist, ginge das mit
> haltungen.add(h2); // 2 Klammern!
aber während man gerade über Listen iteriert sollte man tunlichst nichts einfügen/ löschen

Einfügen in eine separate Liste wäre eher erlaubt und leicht zu machen,
ob einfach nur add() oder mit Index oder insert(), das kann man jeweils im Detail anschauen

------

du siehst, die Welt ist rund, Deutschland wird Europameister und Programmieren ist leicht,
nur einen Befehl nach dem anderen, Quatsch wie x in Halterungen-Liste einfügen vermeiden
und überlegen und aussprechen, was du möchtest
 
Zuletzt bearbeitet von einem Moderator:

PhilBauing

Mitglied
@HimBromBeere:

Die vertikalen Rohre sind die Schächte, die Horizontalen Rohre sind die Haltungen. Du hast recht, dass eine Haltung im Prinzip nichts von ihren Koordinaten wissen muss. Ich hab allerdins, nichtmal ansatzweise einen Schimmer davon, wie ich zwei ArrayListen verbinde. Ich kenne nur ArrayListen in ArrayListen.

edit: Hier ein Bildchen:

Pic-Upload.de - Unbenannt.png

@Slater B:

Danke, jetzt verstehe ich auch, warum du letztens geschrieben hast: ein neuer Tag - eine neue Zeile

Ich wusste, dass man die Zeile 3 über mehrere Zeilen verteilen kann, nur dachte ich, dass genau das der 'unsauberere' Weg ist.

[Java]
{
// Hier wird eine vorschleife durchlaufen, den aktuellen Index verwende ich um auf die Elemente in meinen ArrayListen zuzugreifen.
for (int i = 0; i < haltungen.size(); i++) {
// Die Haltung des aktuellen Indices wird der Variablen h vom Typ Haltung zugewiesen
Haltung h = haltungen.get(i);
// Der Schacht des aktuellen Indices wird der Variablen s vom Typ Schacht zugewiesen
Schacht s = schaechte.get(i);
// Hier wird die x-Koordinate des aktuellen Schachtes, der Variablen 'x' übergeben
Double x = s.getxKoordinate();
// Diese Variable, soll über setxKoordinate an die Haltung h übergeben werden.
h.setxKoordinate(x);
}
[/Java]

Hierdurch entsteht ein Fehler:

Exception in thread "main" java.lang.NullPointerException
at rohrnetz.Rohrnetz.<init>(Rohrnetz.java:45)
at rohrnetz.RohrnetzTest.main(RohrnetzTest.java:9)

Wenn ich es richtig verstehe, zeige ich auf ein Objekt, welches mit 'null' initialisiert wurde!? Liegt es vielleicht daran, dass die Variable xKoordinate nicht im Konstruktor der Klasse Haltung vorkommt?

Habe ich es richtig verstanden, dass das hinzufügen einer neuen Liste sinnvoller programmiert und einfacher wäre?

Danke für eure Hilfe.

Grüße
 
Zuletzt bearbeitet:

HimBromBeere

Top Contributor
Ich zitiere nochmal Slater:
Quatsch wie x in Halterungen-Liste einfügen vermeiden
Die Koordinaten der Schächte haben in den Haltungen nichts zu suchen. Leg dir zu jeder Haltung eine Liste der eingehenden Schächte an, in den Schöchten stehen die Koordinaten dann schon drin.

Java:
Schacht s1 = new Schacht(3, 4, 5, ...);  // Paramater: x, y, z, ...
Schacht s2 = new Schacht(1, 2, 3, ...);
Haltung h = new Haltung(...);
h.addSchacht(s1);
h.addSchacht(s2);

Wenn ich es richtig verstehe, zeige ich auf ein Objekt, welches mit 'null' initialisiert wurde!? Liegt es vielleicht daran, dass die Variable xKoordinate nicht im
Wäre tendentiell möglich, da wir aber nicht wissen, was bei dir Zeile 45 ist, können wir die diesbezüglich auch nicht mehr sagen. Die andere Möglichkeit wäre, dass deine Liste
Code:
haltungen
(oder
Code:
schaechte
)nicht initialisiert wurde.
 
Zuletzt bearbeitet:

PhilBauing

Mitglied
Langsam kommt Licht ins Dunkle.

Ich habe es jetzt so verstanden, dass ich eine Methode addSchacht(Schacht schaechte) für eine 'ArrayList<Haltung> haltungsdaten'
schreiben muss, die diese dann füllt? Sowie meine neuerSchacht/neueHalung Methoden?

Das verstehe ich ehrlich gesagt nicht ganz, mir kommt es so vor, als würde dann doch wieder nur eine ArrayListe erzeugt werden, die aber genauso aussieht wie die ArrayList schaechte nur anders heißt und keine verbindung zur ArrayList haltung hat.

Oder meinst du soviele neue ArrayListen zu erstellen wie es Haltungen gibt und dann immer zwei Objekte in diese Listen tun für den Anfangs bzw. Endschacht? Da könnte ich mir vorstellen wie ich das machen könnte, dann stellt sich für mich nur die Frage, ob ich versuchen soll eine for-Schleife zu basteln, die das automatisch macht, also zu jeder Haltung eine neue ArrayList hinzufügen die zwei Schächte beinhaltet, oder wäre das zu kompliziert?


edit: Arg, das ist mir natürlich nicht aufgefallen...
[Java]
{
// Hier wird eine vorschleife durchlaufen, den aktuellen Index verwende ich um auf die Elemente in meinen ArrayListen zuzugreifen.
for (int i = 0; i < haltungen.size(); i++) { //**<<<<----Das ist Zeile 45 in meine Code**//
// Die Haltung des aktuellen Indices wird der Variablen h vom Typ Haltung zugewiesen
Haltung h = haltungen.get(i);
// Der Schacht des aktuellen Indices wird der Variablen s vom Typ Schacht zugewiesen
Schacht s = schaechte.get(i);
// Hier wird die x-Koordinate des aktuellen Schachtes, der Variablen 'x' übergeben
Double x = s.getxKoordinate();
// Diese Variable, soll über setxKoordinate an die Haltung h übergeben werden.
h.setxKoordinate(x);
} [/Java]
 
Zuletzt bearbeitet:
S

SlaterB

Gast
du darfst nicht nur bzw. betont in Java denken sondern erstmal in der fachlichen Welt,
eine Liste von Schächten in Haltung brauchst du genau dann wenn das aus irgendeinem Grund nützlich ist,
wenn einer Haltung mehrere Schächte zugeordnet sind (ich habe da die Bilder usw. noch nicht angeschaut)

> ob ich versuchen soll eine for-Schleife zu basteln, die das automatisch macht, also zu jeder Haltung eine neue ArrayList hinzufügen die zwei Schächte beinhaltet

automatisch klingt komisch,
wenn der Konstruktor zu Haltung bzw. eine Methode, die sich um das Anlegen kümmert,
von zwei Schächten weiß die relevant snd und gemerkt werden sollen,
dann ist es klar dass die Methode/ der Konstruktor die beiden auch in ein entsprechendes Attribut einfügt, sonst nicht

das normale wären dann zwei add()-Aufrufe,
eine Schleife beim Einfügen bräuchst du, falls du über eine andere Liste iterieren willst
 

HimBromBeere

Top Contributor
Java:
public class Rohrnetz {
    ArrayList<Haltung> haltungen = new ArrayList<Haltung>();

    public void addHaltung(Haltung h) {this.haltungen.add(h);}


    public static void main(...) {
        // erstelle ein paar Schächte
        Schacht s1 = new Schacht(...);
        Schacht s2 = new Schacht(...);
        Schacht s3 = new Schacht(...);

        // erstelle eine Haltung
        Haltung h1 = new Haltung(...);
        h1.addSchacht(s1);
        h1.addSchacht(s2);
        h1.addSchacht(s3);

        // füge die Haltung in die Liste ein
        haltungen.add(h);
    }
}

Java:
public class Haltung {
    ArrayList<Schacht> schaechte = new ArrayList<Schacht>();

    public void addSchacht(Schacht s) {this.schaechte.add(s);}
}

Jetzt ist nur noch die Frage, ob ein einzelner Schacht wissen muss, zu welchen Haltungen er gehört. Sollte dem so sein, musst du halt in der Klasse Schacht ebenfalls eine Liste
Code:
haltungen
bauen (aber im Moment erkenn ich diese Notwendigkeit nicht).
 
Zuletzt bearbeitet:

PhilBauing

Mitglied
Danke auf jedenfall schonmal vielmals für eure Bemühungen mir nicht nur explizit mit dem Problem zu helfen, sondern mir auch Java an sich näher zu bringen!!!

Ich muss jetzt nochmal kurz wohin und beschäftige mich dann gleich weiter damit!!

Danke
 

PhilBauing

Mitglied
Ich glaub ich habs *freu*
[Java]
public class Rohrnetz {

private ArrayList<Schacht> schaechte;

private ArrayList<Haltung> haltungen;

// Hier wird die neue Variable schachtübergabe deklariert

private ArrayList<Schacht> schachtübergabe;

// Hier initialisiere ich die neue ArrayList
public Rohrnetz() {
schaechte = new ArrayList<Schacht>();
haltungen = new ArrayList<Haltung>();
schachtübergabe = new ArrayList<Schacht>();

}
// In dieser Methode werden in Abhängigkeit zweier Int werte neue Schächte der ArrayList schachtübergabe zugefügt.
// Durch "getSchaechte().get(anfan/ende) werden genau die Schächte zugefügt, dessen Indices man an den Methodenkopf
// übergibt.

public void neueSchachtübergabe(int anfang, int ende) {
this.schachtübergabe.add(getSchaechte().get(anfang));
this.schachtübergabe.add(getSchaechte().get(ende));
}

[/code]

Zur Überprüfung (in der Klasse Schacht):

[Java]
@Override
public String toString() {
return " X-Koordinate: " + xKoordinate + " Y-Koordinate: "
+ yKoordinate + " Z-Koordinate: " + zKoordinate;
[/code]

In meiner main() Rohrnetztest habe ich dann noch die beiden neuen ArrayListen der Haltungen eingefügt und in der Console ausgegeben.

[Java]
rohrnetz.neueSchachtübergabe(1, 2);
rohrnetz.neueSchachtübergabe(2, 3);

[...]
for (int i = 0; i < rohrnetz.getSchachtübergabe().size(); i++) {
System.out.println(rohrnetz.getSchachtübergabe().get(i));[/code]

Soweit klappt alles. Die Console liefert:

[Java]
X-Koordinate: 25.0 Y-Koordinate: 30.0 Z-Koordinate: 0.0
X-Koordinate: 10.0 Y-Koordinate: 25.0 Z-Koordinate: 0.0
X-Koordinate: 10.0 Y-Koordinate: 25.0 Z-Koordinate: 0.0
X-Koordinate: 40.0 Y-Koordinate: 37.0 Z-Koordinate: 0.0[/code]

Soweit sogut.

Jetzt sitze ich schon seit längerem daran, die Daten aus der neuen ArrayList auszulesen um z.B. das Gefälle einer Haltung auszurechnen.

Zuerst sah es für mich so aus, als wenn die ArrayList schachtübergabe aus 4 Schächten besteht, wie in der Konsole ausgegeben wird, wobei die Ungeraden Schächte die Anfangsschächte sind und die Geraden Schächte die Endschächte. (Ich mein die Position an der sie in der Liste stehen).

Nach weiteren Überlegungen bin ich zu dem Entschluss gekommen, die Methode von der Position der Haltung abhängig zu machen, da es nun einfach ist mit (2n-1) auf die ungeraden und mit 2*n auf die graden Indices zuzugreifen.

So sah das ganze dann aus: (ja, bisher wird nur die Differenz der X-Koordinaten berechnet)

[Java]
// Wie gesagt, als Argument eine ArrayList und ein Int Wert
public static double berechneGefälle(ArrayList<Schacht> schachtübergabe,int haltungsnummer){

// Damit es übersichtlicher bleibt der multiplikator
int multiplikator= 2*haltungsnummer;

// Das soll immer der ungerade Schacht in der Liste sein
Schacht anfangsschacht = schachtübergabe.get(multiplikator-1);

// und das der gerade.
Schacht endschacht = schachtübergabe.get(multiplikator);

// hier wird die X-Koordinate des Anfangsschacht an die Variable übergeben
double anfangsxkoordinate = anfangsschacht.getxKoordinate();

// Dasselbe mit dem Endschacht an eine andere Variable
double endxkoordinate = endschacht.getxKoordinate();

// Die Differenz
return anfangsxkoordinate-endxkoordinate;
[/code]

In der main() kam hinzu:

[Java]
System.out.println(Rohrnetz.berechneGefälle(rohrnetz.getSchachtübergabe(), 2));[/Java]

Das ergebnis war:

[Java]

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at rohrnetz.Rohrnetz.berechneGefälle(Rohrnetz.java:55) //<<---- Das ist diese Zeile: Schacht // endschacht = schachtübergabe.get(multiplikator);
at rohrnetz.RohrnetzTest.main(RohrnetzTest.java:46)//<<--Das ist wo ich in der main() die //Methode in System.out.prinln([...]) aufrufe

[/code]

Das lässt mich zu dem entschluss kommen, dass ich irgendwo einen Fehler gemacht habe, da die Einträge ja mit der neueSchachtübergabe() Methode doppelt geadded werden und in der ErrorMsg steht, dass ich versuche auf Index 4 zuzugerifen obwohl die Size 4 ist (was doch eigentlich okay ist oder?), vermute ich, dass die Indices der schachtübergabe ArrayList vielleicht doch anders vergeben werden als 1.,2.,3.,4.,...,n. Gibt es sowas wie 1.1, 1.2, 2.1, 2.2, für die Indices bei solche Listen? Oder findet ihr meinen Fehler?
Wenn ich in der Methode als Position 1 angebe, gibt die Konsole die Zahl "0" zurück. Also stimmt auch was mit der berechnung nicht, weil es ja 15 sein müsste.
Viele Grüße
 
S

SlaterB

Gast
die Indexe bei 4 Elementen sind 0, 1, 2, 3, nicht 1, 2, 3, 4

> for (int i = 0; i < rohrnetz.getSchachtübergabe().size()
schonmal angeschaut was i da ist, welcher Startwert, welcher maximale Wert? ;)
 

HimBromBeere

Top Contributor
Das hier macht der Compiler ja grad noch so mit...
Java:
Schacht anfangsschacht = schachtübergabe.get(multiplikator-1);
Aber hier ist dann Schluss, weil Index 2*2 nicht existiert.
Java:
Schacht endschacht = schachtübergabe.get(multiplikator);
Warum willst du die übergebene Haltungsnummer mit 2 multiplizieren? Wenn ich das richtig sehe, hast du ja wohl 4 Haltungen [0..3]. Dann brauchst du doch nur zu schauen. ob die Haltungsnummer gerade ist (
Code:
haltungsnummer % 2 = 0
) oder nicht.

Wie wär´s, wenn du in der main einfach die "richtige" Haltungsnummer übergibst?
Java:
System.out.println(Rohrnetz.berechneGefälle(rohrnetz.getSchachtübergabe(), <Haltungsnummer>));


[EDIT]
Java:
rohrnetz.neueSchachtübergabe(1, 2);
rohrnetz.neueSchachtübergabe(2, 3);

Bist du sicher, dass es so lauten muss und nicht etwa
Code:
(0, 1)
bzw.
Code:
(1, 2)
?[/EDIT]
 
Zuletzt bearbeitet:

PhilBauing

Mitglied
Ja klar, das tut mir nun wirklich leid, dass hätte ich wissen müssen!

Ich habe dem Ganzen abhilfe geschafft, indem ich

[Java]
Schacht anfangsschacht = schachtübergabe.get(multiplikator-2);
Schacht endschacht = schachtübergabe.get(multiplikator-1);
[/code]

Danke vielmals für die Hilfe. Ich hatte zuerst überlegt die berechnung in einer seperaten Klasse zu machen, aber ich habs irgendwie nicht hinbekommen auf die ArrayList aus der Klasse Rohrnetz zuzugreifen.

Kann man nicht einfach in die Variablendeklaration

Private Rohrnetz rohrnetz;

schreiben um dann mit

rohrnetz.getSchachtübergabe() auf die Schächte zugreifen zu können?

Entweder hat er dann gemeckert, dass ich die Methode static machen soll, wenn ich das nicht gemacht hab, hat die Methode glaube ich eine neue schachtübergabe Liste angelegt die dann leer war und ich habe eine nullpointerexception bekommen.

Ist es okay die Berechnungsmethode in der Rohrnetzklasse zu haben, auch wenn die Methode dann Ellenlang ist?

Edit: @HimBromBeere:

Nein, die Liste Schachtübergabe hat vier Einträge, wovon die geraden Zahlen die Anfangsschächte einer Haltung sind und die ungeraden die Endschächte.

Deshalb greift die Methode mit 1 für 1.Haltung jetzt auf Eintrag 0 und Eintrag 1 aus der Liste Schachtübergabe zu.

Edit2: @HimBromBeere:

Ne so ist schon richtig glaube ich, da Haltung eins und zwei ja so aussehen:
Java:
Haltung h1 = new Haltung(50, 1, 2);
Haltung h2 = new Haltung(50, 2, 3);
 
Zuletzt bearbeitet:

HimBromBeere

Top Contributor
Kann man nicht einfach in die Variablendeklaration

Java:
 Private Rohrnetz rohrnetz;

schreiben um dann mit

Java:
 rohrnetz.getSchachtübergabe()
auf die Schächte zugreifen zu können?

Entweder hat er dann gemeckert, dass ich die Methode static machen soll, wenn ich das nicht gemacht hab [...]
Wobei das
Code:
static
auch nichts geändert hätte, denn...
[...] ich [hätte] eine nullpointerexception bekommen.
Du musst dein Rohrnetz erstmal initialisieren (im Moment deklarierst du es bloß, was etwa so viel heißt wie: lege eine Variable mit dem Namen an, fertig. Was da drin stehen soll, sagst du nicht).
Java:
Rohrnetz r = new Rohrnetz(...);
// TODO: füge Schächte in die Liste schaechte ein
r.neueSchachtuebergabe(1, 2);
r.neueSchachtuebergabe(2, 3);

[EDIT]
Ne so ist schon richtig glaube ich, da Haltung eins und zwei ja so aussehen:
Mag ja sein, aber deine einzelnen Schächte liegen in der Schächteliste immer noch beginnend bei 0 vor, womit du mittels
Code:
schaechte.get(i)
auf das falsche Element zugreifst (i = 1 ist eben nicht das erste sondern das zweite Element)
[/EDIT]
 
Zuletzt bearbeitet:

Oben