Datenstruktur für Hierarchie/Baum mit Tiefe 3

dermoritz

Bekanntes Mitglied
Ich grübele seid Tagen an einer vernünftigen Datenstruktur für eine 3-stufige Hierrchie aus ID->Wert Paaren. Genaugenommen ist es die Hierarchie Bundesländer->Kreise->Gemeinden wobei jedes dieser Dinge eine ID und einen nicht eindeutigen Namen hat. Die ID ist Amtlicher Gemeindeschlüssel ? Wikipedia .

Das ganze ist in einer flachen Tabelle gespeichert und es ist nötig das die komplette Tabelle (mit Hierarchie) auf den Client (ein WebBrowser) geladen wird bzw. eben als Java-Objekt(GWT macht ein JS"Objekt" draus) verfügbar ist. Mein erster Ansatz ist eine Map<String, Map<String,<List<String>>>> also Map<BundeslandID, Map<KreisID,<Liste<GemeindeID>>>>.

Nur fehlen dann die Namen, die könnte ich in einer weiteren Map<Id->Name> halten, aber genau an diesem Punkt kommt mir das alles etwas ineffizient (was den Speicher betrifft) vor. Andererseits in der Map anstelle von String String[2] zu speichern kommt mir auch nicht sehr glorreich vor?!

UseCases sind folgende: gib alle BdLänder/Kreise/Gemeinden, gib alle Kreise zu einem BdLand, gib alle Gemeinden zu einem BdLand, gib alle Gemeinden zu einem Kreis.

Gibt es aus dem Stand eine bessere Lösung für Probleme dieser Art?

Oder könnte ich über eine geschickte (um)Kodierung der IDs mit einer Map auskommen? (die entsprechenden DB-Abfragen basieren alle auf "like" - sie Fragen ob die ID mit z.b. "01" beginnt -> alles was zu Schleswig-Holstein gehört). Damit würde ich bei jedem UseCase immer über alle iterieren aber nur die "benötigten" Einträge Filtern. Wenn das Filtern effizient ist (eine sehr einfach Operation) hätte ich viel Speicher gespart aber nicht sehr viel mehr CPU verbraten?!
 
M

maki

Gast
Maps? Pfui... mach dir doch eine inteligentere Datenstruktur draus ;)

Stichwörter zum Googeln: Composite Pattern für die Struktur, Visitor Pattern event. für das traversieren
 

dermoritz

Bekanntes Mitglied
Danke für die Tips:

zum Kompositum: ich hatte eigentlich gehofft um einen Typ "administrative Einheit" drumrum zukommen bzw. lande ich da immer wieder bei maps.
mein kompositum wäre wie gesagt die "administrative Einheit" sie hätte eine Liste von Kindern (bzs map (id-name)), hätte eine eigene id und einen eigenen namen. Da die gesamte Struktu fest ist würde ein Konstrukteur reichen, der eine ganze Map aufnimmt (die Kinder).
Am Ende hätte ich dann eine ähnliche Struktur die ich vorgeschlagen hab (Map->Map->Map) nur "syntaktisch süßer", oder??
Aber 2 Probleme bleiben bestehen:
1. Ich komme an die Enkelkinder (alle Gemeinden zu einem Bundesland) nur über alle Kreise (for each kreise getKinder) - das ist glaube auch nicht zu vermeiden?!
2. Wie komme ich effizient an einen Namen zu einer ID - ungünstig wäre wenn ich den Baum durchsuchen müsste. Da fällt mir eben bisher auch nix besseres ein, als in einer Map alle Id->Namen zu speichern

zum B(*)-Baum: implementieren würde man den wahrscheinlich auch mit composite pattern?! nur er bietet mir bei weitem zu viel: ich will niemals Elemente löschen oder hinzufügen (nachdem der Baum steht) auch haben meine Knoten nur einen Schlüssel (sich selbst). Und auch hier muss ich über alle Kinder wandern um an die Enkel zu kommen (wie erwähnt kann man das glaube nur mit redundanter Datenhaltung umgehen - 3 Strukturen: BdLand->Kreis, BdLand->Gemeinde, Kreis->Gemeinde)

Um mal meine Frage auf den Punkt zu bringen: Ist die CPU-optimale Lösung für mein Problem mit den 2 Use-Cases, 4 Listen BdLand->Kreis, BdLand->Gemeinde, Kreis->Gemeinde und Id->Name - ist das so?
Gibt es etwas gleich schnelles (mein Ansatz ist glaube O(1)) mit weniger Speicher?
(wie erwähnt wird der Kram letztendlich durch den GWT Compiler in JS übersetzt und landet auf dem Browser - nur was ist besser: viel Speicher oder viel CPU? Crossbrowser-mäßig eher viel Speicher oder? Alte Browser sind ja nicht die schnellsten bei JS?)
 

fastjack

Top Contributor
Dann schreib Dir eine Datenstruktur, die diese Maps ein wenig kapselt und du von Außen halt einfach darauf zugreifen kannst.
 
M

maki

Gast
Moritz, wozu Maps?

Wenn du nach IDs suchen willst ist eine DB wohl besser.

Deine Anforderungen lassen sich Problemlos mit einem Kompositium abdecken.
 

dermoritz

Bekanntes Mitglied
@maki natürlich sind die Daten in einer DB nur muss ich sie in den client laden und dort müssen sie in einer Struktur vorligen. und wie ich gesagt habe fumktioniert das mit dem Kompositum wunderbar (also der Tip war gut!).

Nur um mit Kompositums eine Hierarchy aufzubauen muss jedes Kompositum die Liste seiner Kinder kennen.
Also hätte mein Kompositum ein Feld "List<meinKompositum> kinder". Desweiteren hätte jedes Kompositum ein Feld für "name" und ein Feld für "id" (beides Strings).
Darauf könnte ich dann wunderbar meine Methoden (getKinder(meinKompositum), getKindeskinder(meinKompositum)) aufbauen und hätte so eine Kapsleung wie fastjack vorschlägt. Ganz am Ende im Interface brauche ich jedoch immer die Paare id->name (name wird in combobox angezeigt, id ist die referenzs da name nicht eindeutig). Die Rückgabetypen der Methoden könnten dann z.B. List<String[2]> sein oder eben Map<String, String>.

wie gesagt alles wunderbar(falls ich euch richtig verstanden habe) aber 2 Dinge sind eben meiner Meinung nach gleich (oder schlechter) gegenüber meinemAnsatz vom Anfang (Map<String, Map<String,<List<String>>>> ):
1. Um an alle Gemeinden eines Bundeslandes zu kommen muss man über alle Kreise iterieren (die Datenbank bzw. eine redundante Struktur würde das vermeiden).
2. um zu einer gegebenen id den namen zu bekommen (effizient) muss ich in einer "LookUpTable" nachsehen also am besten eine Map<String,String>.
Für letzteres wäre die einfache Struktur mit Kompositum sehr inefizient (iteration über alle Kompositums bis man id findet).

Wie im letzten Post von mir beschrieben: vorläufig kann ich gut mit der cpu-optimalen Lösung arbeiten (die 4 Listen etwas in eine Klasse gekaselt). Nur gebe ich nach wie vor die Hoffnung nicht auf, dass es ein Struktur mit weniger Speicherbedarf (es wird wohl immer O(n) sein aber anstelle von 4*n wäre 3*n oder 2*n eben wünschenswert) aber gleicher Performance(O(1)) gibt (B bäume würden glaube für den 2 use-case O(log n) benötigen?!).
 

dermoritz

Bekanntes Mitglied
@maki habe deine "kompositum"-rat befolgt. geht super. nur ist meiner traversierklasse etwas speziell: sie hält alle kompositums in einer flachen Liste. auf die art komme ich an alle ran ohne verschachtelte for schleifen.
 
M

maki

Gast
Wenn dir das reicht, dann ist ja gut :)

Zur Traversierung von Composites eignet sich übrigens das Visitor Pattern sehr gut, nix verschachtelte Schleifen, sondern Rekursiv ;)
Ist besonders dann zu empfehlen, wenn es keine Änderungen an den Nodes mehr gibt, also weitere Unterklassen bzw. Änderungen an bestehenden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Datenstruktur für eine Map erstellen Allgemeine Java-Themen 2
B Suche passende Datenstruktur für 2 Einträge Allgemeine Java-Themen 19
S Welche Datenstruktur für verschiedene Sprachen sinnvoll? Allgemeine Java-Themen 2
N Datenstruktur für Netze gesucht Allgemeine Java-Themen 8
T Datenstruktur für großes Netz Allgemeine Java-Themen 2
S Datenstruktur für einen Baum Allgemeine Java-Themen 5
T Datenstruktur für Straße ! Allgemeine Java-Themen 5
M Eigene Datenstruktur um eine Menge zu speichern Allgemeine Java-Themen 3
Kirby.exe Union Find Datenstruktur Allgemeine Java-Themen 27
U Klassen Komplexe Datenstruktur in Java Allgemeine Java-Themen 4
B Suche geeignete Datenstruktur Allgemeine Java-Themen 5
ruutaiokwu datenstruktur welche sich "im kreis" dreht Allgemeine Java-Themen 26
P Große Datenstruktur im Speicher halten Allgemeine Java-Themen 13
G Welche Datenstruktur? Allgemeine Java-Themen 19
R Collections Datenstruktur gesucht Allgemeine Java-Themen 12
D Datenstruktur .. BlockingQueue (LIFO) Allgemeine Java-Themen 3
P Suche Datenstruktur Allgemeine Java-Themen 2
ruutaiokwu schnelle datenstruktur... Allgemeine Java-Themen 13
S Baumstruktur/Datenstruktur in Datei speichern Allgemeine Java-Themen 23
D Datenstruktur Allgemeine Java-Themen 2
B Datenstruktur: Liste Allgemeine Java-Themen 5
A Thread sichere Datenstruktur Allgemeine Java-Themen 5
J Arrayähnliche Datenstruktur Allgemeine Java-Themen 4
B Script Problem "Dynamische Datenstruktur" Allgemeine Java-Themen 13
S Frage zum Design der Datenstruktur Allgemeine Java-Themen 10
G Datenstruktur: LISTEN Allgemeine Java-Themen 7
D Suche nach passender Datenstruktur Allgemeine Java-Themen 4
G Daten von Excel kopieren - sinnvolle Datenstruktur? Allgemeine Java-Themen 3
U eigene Datenstruktur ArrayList<String> nach Object [][ Allgemeine Java-Themen 2
F welche Datenstruktur? Allgemeine Java-Themen 9
F Welche Datenstruktur Allgemeine Java-Themen 2
T Datenstruktur gesucht Allgemeine Java-Themen 18
Z Welche Datenstruktur verwende ich h_ier bloss ? Allgemeine Java-Themen 14
G NullPointer. in einer Datenstruktur Allgemeine Java-Themen 2
S Welche Datenstruktur passt bei mir? Allgemeine Java-Themen 6
H Speicheverbrauch einer Datenstruktur ermitteln Allgemeine Java-Themen 29
S Suche geeignete Datenstruktur Allgemeine Java-Themen 27
D Welche Datenstruktur? Allgemeine Java-Themen 2
B Datenstruktur elegant zerlegen Allgemeine Java-Themen 6
G Datenstruktur gesucht: Allgemeine Java-Themen 3
A Datenstruktur und Sortierung Allgemeine Java-Themen 12
B Algorithmus für Arbeit mit fehlenden Listenelementen? Allgemeine Java-Themen 1
kodela Eingabe für TextArray bedingt sperren Allgemeine Java-Themen 3
Karl_Der_Nette_Anfänger Hat wer ne Lösung für verknüpfte Postleitzahlen? (Baum/Wurzel Struktur) Allgemeine Java-Themen 11
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
G KeyListener für JTextField Allgemeine Java-Themen 5
webracer999 Library für Textsuche (z. B. include/exclude, and/or)? Allgemeine Java-Themen 5
I Module-Info für Jar erzeugen Allgemeine Java-Themen 7
krgewb Java-Bibliothek für ONVIF Allgemeine Java-Themen 1
B Simpler Eventlistener für Tastaturtaste bauen? Allgemeine Java-Themen 13
_user_q Eingegebenen Text Zeile für Zeile ausgeben lassen Allgemeine Java-Themen 11
E Key für TOTP Algorythmus(Google Authentificator) Allgemeine Java-Themen 0
S Formel für Sonnenwinkel in ein Programm überführen Allgemeine Java-Themen 11
M pfx-Zertifikat in Tomcat für SSL-Verschlüsselung nutzen Allgemeine Java-Themen 14
R Best Practice Erfahrungswerte für eine Migration von JSF nach Angular (oder anderes JS-Framework) Allgemeine Java-Themen 1
B HeapSort für Array of Strings funktioniert nur teilweise Allgemeine Java-Themen 3
jhCDtGVjcZGcfzug Klassen Was genau passiert hier? Kann mir das jemand bitte Zeile für Zeile erklären? Allgemeine Java-Themen 1
rosima26 Bester Sortieralgorithmus für kurze Arrays Allgemeine Java-Themen 40
S Mit Methoden kann man definieren für was <T> steht. Geht das auch irgendwie für Variablen? Allgemeine Java-Themen 12
MangoTango Operatoren while-Schleife für Potenz Allgemeine Java-Themen 3
B Lottospiel, genug Reihen tippen für 3 Richtige (Spaß mit Arrays)? Allgemeine Java-Themen 46
B Mit welchen Datentypen und Strukturierung am Besten dutzende Baccaratspiele Shcritt für Schritt durchsimulieren? Allgemeine Java-Themen 26
D Klassendesign für einen Pascal Interpreter Allgemeine Java-Themen 6
I OCR Library für Belegerkennung Allgemeine Java-Themen 7
farah GetterMathod für Farbkanäle Allgemeine Java-Themen 6
B Welcher Datentyp für sehr große Zahlenbereiche? Allgemeine Java-Themen 1
S Webservices für binäre Daten? Allgemeine Java-Themen 5
G Licence-Header für InHouse entwickelten Source Allgemeine Java-Themen 8
M Schleife für einen TicTacToe Computer Allgemeine Java-Themen 5
O git ignore für Intellji braucht es die .idea Dateien? Allgemeine Java-Themen 8
F Java Script für das Vorhaben das richtige? Allgemeine Java-Themen 9
M wiviel Java muss ich für die Berufswelt können ? Allgemeine Java-Themen 5
Robertop Datumsformat für GB ab Java 16 Allgemeine Java-Themen 1
Thallius Verschiedene entities für gleichen Code…. Allgemeine Java-Themen 8
OnDemand Zentrale "Drehscheibe" für verschiedene APIs Allgemeine Java-Themen 14
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
F Streams als Alternative für dieses Problem ? Allgemeine Java-Themen 15
D SHA-3 für Java-version 1.8 Allgemeine Java-Themen 1
N Validator für einen SQL-Befehl Allgemeine Java-Themen 22
Muatasem Hammud Erstellung von Testdaten für Arrays Allgemeine Java-Themen 6
B Logikfehlersuche, das perfekte Lottosystem für 3 Richtige mit Arraylists? Allgemeine Java-Themen 61
G Methoden für die Zukunft sinnvoll? Allgemeine Java-Themen 4
M API für PLZ Umkreissuche Allgemeine Java-Themen 3
1Spinne JDK 8 für Eclipse installieren Allgemeine Java-Themen 5
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
L Methoden Parser für gängige Datumsformate? Allgemeine Java-Themen 1
H Interface PluginSystem ClassNotFound exception für library Klassen Allgemeine Java-Themen 10
N relativier Pfad für sqlite-Datenbank in Gradle/IntelliJ Allgemeine Java-Themen 2
buchfrau Anagram für beliebiges Wort Allgemeine Java-Themen 2
TonioTec Api für Datenaustausch zwischen Client und Server Allgemeine Java-Themen 0
W Suche Ursache für NPE - woher kommt sie? (Hilfe beim Debugging) Allgemeine Java-Themen 19
Kirby.exe Distanz Map für die Distanztransformation erstellen Allgemeine Java-Themen 1
F PI Regler für Heizung Allgemeine Java-Themen 7
8u3631984 Generelle Log4j.xml für alle Module Allgemeine Java-Themen 5
M Wie übergebe ich den Zähler für die Anzahl Rekursionsschritte korrekt? Allgemeine Java-Themen 2
B Login für User, der im Hintergrund Schedules ausführt Allgemeine Java-Themen 16
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
S Java-Task-Management-Tool für Windows und Mac selber programmieren Allgemeine Java-Themen 4
M Java 2D Array für ein Grid erstellen ? Allgemeine Java-Themen 2
Z Welches GUI Framework für Java ist aktuell? Allgemeine Java-Themen 16

Ähnliche Java Themen

Neue Themen


Oben