Übersicht trotz mehrdimensionaler Arraylisten

usrr

Bekanntes Mitglied
Hallo,

ich benutze eine mehrdimensionale ArrayList für eine Baumstruktur.

Beispiel:

Stadt->Haus->Zimmer

Jetzt fällt mir aber auf, dass der Programmcode unübersichtlich wird und ich zum Teil über einen erst ein paar Tage alten Code grübeln muss. Was fehlt ist der Bezug Stadt->Haus->Zimmer im Quelltext. Gibt es eine Technik die mir helfen könnte?

Java:
ArrayList<ArrayList<ArrayList<Zimmer>>> welt = new ...

Zimmer = welt.get(a).get(b).get(c);

Weiß jemand was ich meine?
 
S

Sym

Gast
Du sprichst schon selbst von einer Baumstruktur. Warum nutzt Du dann nicht einen Baum?

Alternativ halte die Daten in einer Datenbank und baue nicht den kompletten Baum auf, wenn Du ihn nicht brauchst.
 
S

SlaterB

Gast
sinnvoll wären auch richtige Klassen,
Klasse Stadt mit einer Liste von Häusern,
Klasse Haus mit einer Liste von Zimmern..

alle Daten eines Programmes passen in x GB linearen Arbeitsspeicher, aber erst mit Klassen und Objekten wirds schön damit zu arbeiten..
 

bERt0r

Top Contributor
Sprechende Variablennamen verwenden:
Java:
Zimmer zimmer = welt.get(stadtNr).get(hausNr).get(zimmerNr);
liest sich doch schon leichter.
 

usrr

Bekanntes Mitglied
Danke für die Antworten.

Ich muss mich noch durchwühlen bis ich zum nächsten Plateau komme. Ich werde mal schauen ob ich den Code dann so umbauen kann, dass ein Baum verwendet wird.

Aber ich dachte eigentlich die ArrayList wäre schon ein Baum. Beim Googlen habe ich auch nur JTree gefunden. Gibt es da noch bessere Klassen für?
 

langhaar!

Bekanntes Mitglied
Du sprichst schon selbst von einer Baumstruktur. Warum nutzt Du dann nicht einen Baum?

Bei vorliegendem Konstrukt der Tiefe 3, wobei jede Ebene eine fest definierte andere Bedeutung hat, würde ich keinen Baum nehmen sondern ebenfalls Listen. Durch einen Baum zu iterieren und dann die Bedeutung des Knotens (Zimmer, Stadt, Haus) über die Tiefe herauszufinden, ist völlig intransparent.
Zudem müsste man entweder die Knoten untypisiert lassen oder sich selber eine aufwändige Baumdatenstruktur schreiben.

Java:
ArrayList<ArrayList<ArrayList<Zimmer>>> welt = new ...
Das Beispiel ist übrigens kein Baum sondern ein Wald, da kein Wurzelknoten existiert.
 
Zuletzt bearbeitet:

bERt0r

Top Contributor
Ich glaube die Realisierung mit verschachtelten Collections ist schon in Ordnung, JTree ist ganz was anderes.
Edit: naja der Wurzelknoten wäre um übertragenen Sinne "welt", eben die oberste Collection.
 

faetzminator

Gesperrter Benutzer
Aber ich dachte eigentlich die ArrayList wäre schon ein Baum. Beim Googlen habe ich auch nur JTree gefunden. Gibt es da noch bessere Klassen für?

Naja, ein Tree ist IMHO eigentlich nur so etwas:

Java:
public class Tree {

    private Node rootNode;

    public Tree(...) {
        // init
    }

    public Node getRootNode() {
        return rootNode;
    }
}
Java:
public class Node {

    private List<Node> childs = new ArrayList<Node>();
    // und noch die privaten Felder...

    //...
}
 

Marco13

Top Contributor
Könnten diejenigen, die eigene Klassen vorschlagen, mal anskizzieren, wie die aussehen sollten? Naja... vielleicht nicht so wichtig... es ist eigentlich klar.
Der Pragmatische Programmierer auf meiner linken Schulter hat gesagt.:
Durch die Namen und definierten Typen bleibt der Code leichter verständlich und man kann leicht zusätzliche Methoden einbauen, die spezifisch für die jeweiligen Klassen sind :toll:
Der abstraktions-Geek auf meiner rechten Schulter hat gesagt.:
Eine Klasse zu erstellen, die genau die Semantik einer List hat ist doch voll sinnlos :autsch: und [c]List<List<List<Zimmer>>> welt;[/c] ist doch schon schön kurz.
:(
 
M

maki

Gast
List bietet ja um einiges mehr als notwendig, das liegt einfach daran, dass List eben eine generische Schnittstelle (nicht im Sinne von Java Generics) ist die für alle möglichen Anwendungen anwendbar sein sein.

Es heisst ja:
Je generischer eine Schnittstelle/API/Framework, umso schwieriger ist es sie zu nutzen, aber umso leichter ist sie wiederzuverwenden.
Bei konkreten Schnittstellen die ein spezifisches Problem behandeln, ist es einfach sie zu verwenden, aber sie sind schwieriger wiederzuverwenden.

Für dein beispiel:
Java:
List<List<List<Zimmer>>> welt ...
der meiste Code darin bezieht sich auf flexibilität die in diesem konkreten fall nie benötigt wird, einfacher wäre
Java:
Welt welt ...
Genauso verhält es sich mit den Methoden im List Interface, behaupte mal das von den 20+ Methoden mind. 80% nicht benötigt werden -> ziemlich schlechtes Singal/Rausch verhältnis, schwierirger zu verstehen als ein Welt Interface/Klasse mit vielleciht 4-6 spez. Methoden.
 
S

SlaterB

Gast
und da fällt mir auch was ein:
genau wie man List statt ArrayList nutzen sollte
(schließlicht heißt es im ersten Post gar ArrayList<ArrayList<ArrayList<Zimmer>>> welt),
könnte es hier eine eigene noch abstraktete Klasse sein,
für den Fall dass man später lieber intern auf Map oder wer weiß was wechselt

aber so gesehen könnte man ja jede Verwendung von List in allem Programmen streichen,
wann es sich lohnt muss man abschätzen, die Welt ist es vielleicht wert, der Wald wäre nicht genug™
 

faetzminator

Gesperrter Benutzer
Bäume sind ein mathematisches Konstrukt; keine konkrete Implementierung. Ein Baum kann auch über eine statische Schachtelung von z.B. List erreicht werden. Die Tiefe ist dann vorgegeben. Wie du deinen Baum realisierst ist völlig egal. So lange er der Definition eines Baums genügt, ist es einer. ;)

Baum (Graphentheorie) ? Wikipedia

Es kommt aber immer darauf an, ob die Nodes, welche keine "Blätter" sind (sondern "Zweige"), auch Daten halten müssen. Dann braucht man irgendwas wie ich es postete. Wenn man es mit einem [c]List<List<List<Foo>>>[/c] lösen kann, dann würde ich das einfach ein multidimensionales Array nennen.
 

langhaar!

Bekanntes Mitglied
Für Bäume gibt es doch auch ein Entwurfsmuster: Composite Pattern

Man kann mit diesem Entwurfsmuster Baumstrukturen abbilden. Es gibt aber - und das war mein Einwand an faetzminator - weitere Möglichkeiten.
Man kann z.B. auch Struktur und Inhalt eines Baumes in einem einzigen String codieren.

Sonst könnte man in Sprachen wie Assembler keine Bäume abbilden.
Es wäre sogar in Java für einen Benutzer einer KLasse gar nicht ersichtlich, ob diese intern den Baum in Knoten und Listen oder in einem einzigen String speichert.

@faetzminator
Das bei einer einfachen Schachtelung von Listen keine Inhalte bei den Knoten die keine Blätter sind, ist richtig. Da bin ich bei dir.
 
Zuletzt bearbeitet:
M

maki

Gast
Hi langhaar, klar gibt es Alternativen, zB. kann man einen ganzen Baum in ein einziges Array packen ;)
Ein String mit einer sog. "Kaskadennummer" pro Knoten repräsentiert dann die Struktur

1
1.1
1.2
1.2.1
1.2.1.1
1.2.1.2
1.2.1.3

usw.

Kann etwas müsehlig sein den Baum zu traversieren ;)
Wenn die knoten aber schon in "pre order" reihenfolge im Array liegen, ist das traversieren sehr einfach.
Aufwendig ist dann nur noch das ein- und aushängen von Knoten.
 
Zuletzt bearbeitet von einem Moderator:

Marco13

Top Contributor
List bietet ja um einiges mehr als notwendig, das liegt einfach daran, dass List eben eine generische Schnittstelle (nicht im Sinne von Java Generics) ist die für alle möglichen Anwendungen anwendbar sein sein.

OK, dann würde mich jetzt DOCH mal so eine Klasse "Haus" interessieren... Sowas wie
Java:
class Haus
{
    private List<Room> rooms;
    public int getNumRooms() {
        return rooms.size();
    }
    public Room getRoom(int i) { 
        return rooms.get(i);
    }
}
wäre dann eine Option (mit Vor- und Nachteilen) und
Java:
class Haus
{
    private List<Room> rooms;
    public List<Room> getRooms() { 
        return Collections.unmodifiableList(rooms); 
    }
}
eine andere. Ich finde es halt praktisch, wenn man sowas machen kann wie
Java:
void collectAllRooms()
{
    List<Room> result = new ArrayList<Room>();
    for (Haus haus : hauser) {
        result.addAll(hasu.getRooms());
    }
}
Allgemein: Wenn man die gesamte Collections-Maschinerie verwenden kann, ohne per Hand irgendwelcher Schleifen basteln zu müssen wie
Java:
for (int i=0; i<haus.getNumRooms(); i++) ...

Aber spätestens wenn eine Klasse "Haus" nur eine Methode hat, die eine Liste von Rooms liefert, kann man dessen Existenzberechtigung in Frage stellen (abgesehen von den schon angedeuteten Dingen, dass irgendwann noch eine Methode "getHausnummer" oder so dazukommen kann... das muss man sich halt überlegen). Sonst könnte man auch auch gleich das machen, was IMHO extrem häßlich ist:
Java:
class Haus extends ArrayList<Room> { /* leer!!! */ }
...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Mxxxt Übersicht Java-Packages Java Basics - Anfänger-Themen 3
S Verschachtelte Exceptions - Übersicht verbessern Java Basics - Anfänger-Themen 2
T Collections Übersicht Collections Java Basics - Anfänger-Themen 4
S Übersicht Java Java Basics - Anfänger-Themen 15
K Übersicht für Parsemethoden Java Basics - Anfänger-Themen 2
S Übersicht der Eigenschaften von Klassen Java Basics - Anfänger-Themen 8
B Wo finde ich eine Übersicht aller Methoden? Java Basics - Anfänger-Themen 2
W Null-Pointer trotz Konstruktor? Java Basics - Anfänger-Themen 9
heinrich172 Methoden Trotz gleichem Element stimmt Vergleich nicht? Java Basics - Anfänger-Themen 7
U Breite von Textfeldern trotz Layoutmanager Java Basics - Anfänger-Themen 4
I Programm erkennt nicht an das Array zurückgegeben wird trotz Initialisierung *einfach* Java Basics - Anfänger-Themen 9
tun3d Packet trotz richtiger Addressierung nicht auffindbar? Java Basics - Anfänger-Themen 10
P Apache Derby wird in Eclipse trotz Anbindung nicht gefunden Java Basics - Anfänger-Themen 6
Kotelettklopfer Output korrekt trotz falschem Lösungsweg !? Java Basics - Anfänger-Themen 99
P NoClassDefFoundError: org/apache/commons/collections4/ListValuedMap trotz vorhandener Klasse? Java Basics - Anfänger-Themen 10
E Timer trotz erwartender Eingabe durchlaufen lassen Java Basics - Anfänger-Themen 11
V_Fynn03 Erste Schritte JButton funktioniert nicht trotz richtiger Methode. Java Basics - Anfänger-Themen 17
J bundel - Datei wird nicht gefunden. Trotz STRG-SHIFT-J Java Basics - Anfänger-Themen 2
U UnsupportedClassVersionError trotz neuster JRE und JDK Version Java Basics - Anfänger-Themen 7
J Unterschiedliche Ordnerstrukturen trotz gleicher Entwicklungsumgebungen Java Basics - Anfänger-Themen 3
M java.io.FileNotFoundException trotz dass Verzeichnis korrekt angegeben ist! Java Basics - Anfänger-Themen 20
helldunkel While Schleife trotz false Java Basics - Anfänger-Themen 4
L Methoden if Bedingung trotz Erfüllung, nicht angesprochen Java Basics - Anfänger-Themen 12
L [Verständnisproblem] Array wird trotz void rückgabe verändert. Java Basics - Anfänger-Themen 5
C Threads SwingWorker läuft trotz cancel weiter Java Basics - Anfänger-Themen 22
M Interpreter-Fehler Nullpointerexception trotz Ordentlicher Initialisierung Java Basics - Anfänger-Themen 4
D javac kann trotz PATH-Eintrag nicht gefunden werden (Hello World) Java Basics - Anfänger-Themen 10
P Threads Trotz Threads wird nur 1 Prozessorkern ausgelastet Java Basics - Anfänger-Themen 7
A Heap Space Error bei rekursiver Suche in Dateien trotz nur einer Zeile im Speicher Java Basics - Anfänger-Themen 26
X Array trotz Befüllung "null" Java Basics - Anfänger-Themen 11
M Arrayfelder werden trotz Beschränkung unbeschrenkt ausgegeben Java Basics - Anfänger-Themen 2
Fab1 alte Java Datei wird ausgeführt (trotz Änderung) Java Basics - Anfänger-Themen 4
O Downloaden: Trotz If Abfrage wird Datei heruntergeladen Java Basics - Anfänger-Themen 2
M Datentypbewahrung trotz Erbung Java Basics - Anfänger-Themen 12
L Applet : keine Recht für Zugriff auf Clipboard (trotz Zertifikat) Java Basics - Anfänger-Themen 4
N Input/Output EOF-Exception trotz Fehlerüberprüfung Java Basics - Anfänger-Themen 2
S Java Heap space trotz -Xmx1024 Java Basics - Anfänger-Themen 10
J trotz Error weitermachen Java Basics - Anfänger-Themen 4
V Kein neuer Thread trotz Runnable Java Basics - Anfänger-Themen 4
X JFrame als JAR unsichtbar trotz Exception Handling Java Basics - Anfänger-Themen 5
Y Trotz add wird Image in GradBagLayout nicht angezeigt Java Basics - Anfänger-Themen 5
L Polymorphie <identifier> expected trotz "Angabe" Java Basics - Anfänger-Themen 2
O ausgabe spinnt trotz erfolgreichem kompilieren Java Basics - Anfänger-Themen 2
D Jar klappt nicht trotz main Methode Java Basics - Anfänger-Themen 19
S JButton trotz Box-Layout skalieren Java Basics - Anfänger-Themen 6
D OpenCSV Fehllender Konstruktor trotz import und Buildpath Eintrag Java Basics - Anfänger-Themen 1
X dll löschen trotz zugriff durch java programm Java Basics - Anfänger-Themen 5
U if-Anweisung trotz Division/0 Java Basics - Anfänger-Themen 6
K BufferedReader/Writer trotz Cache? Java Basics - Anfänger-Themen 9
D Ein boolean[] Array größer als 63.000.000 erstellen? trotz -Xms und -Xmx.... Java Basics - Anfänger-Themen 7
Q Listen - DefaultListModel trotz Design ueber GUI? Java Basics - Anfänger-Themen 10
A Trotz Thread ist Program nicht erreichbar Java Basics - Anfänger-Themen 3
Q Vector verändert trotz final seine Größe Java Basics - Anfänger-Themen 5
A kein zugriff auf variable trotz public? Java Basics - Anfänger-Themen 3
D nicht genug speicher - profiling trotz error Java Basics - Anfänger-Themen 5
D Buttons gehen trotz enebled(false) Java Basics - Anfänger-Themen 8
J Spielfigur wird trotz erfolgreich aufgerufener Methode nicht Java Basics - Anfänger-Themen 22
H javac Befehl trotz Variablen einbindung ned gefunden Java Basics - Anfänger-Themen 23
C Trotz "synchronized" unerwartete Ausgabe Java Basics - Anfänger-Themen 2
K Midi stoppt trotz stop button nicht Java Basics - Anfänger-Themen 3
R windowclosing - fenster schließt immer trotz abfrage Java Basics - Anfänger-Themen 2
C Thread läuft und läuft, trotz interrupt() Java Basics - Anfänger-Themen 9
T laagen trotz Double-Buffering Java Basics - Anfänger-Themen 5
S ClassNotFoundException trotz JAR Einbindung in Eclipse Java Basics - Anfänger-Themen 2
T tooltip trotz gedrückter maustaste Java Basics - Anfänger-Themen 2
0 NoSuchMethodError: main trotz vorhandener Main Methode? Java Basics - Anfänger-Themen 9
Silver-Blue mehrere Instanzen einer Klasse, trotz Random immer das Selbe Java Basics - Anfänger-Themen 7
X trotz gleicher variablen nicht equal Java Basics - Anfänger-Themen 5
G Trotz Abfrage immer noch Zahlen doppelt Java Basics - Anfänger-Themen 3
Curtis_MC Erzeugung mehrdimensionaler Arrays Java Basics - Anfänger-Themen 2
A Datentypen Mehrdimensionaler Datentyp gesucht Java Basics - Anfänger-Themen 4
D Dimensionen mehrdimensionaler Arrays auslesen Java Basics - Anfänger-Themen 2
S Mehrdimensionaler String Array Java Basics - Anfänger-Themen 5
W deep copy mehrdimensionaler Arrays Java Basics - Anfänger-Themen 11
D Mehrdimensionaler Vector Java Basics - Anfänger-Themen 7
E Mehrdimensionaler Array - wie?! Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben