Hierarchie mit HashMap darstellen

Resthirn

Mitglied
Hallo,

irgendwie stehe ich auf dem Schlauch.

Und zwar will ich eine CSV-Datei einlesen und die Elemente als Hierarchie darstellen.

Die CSV hat z.b. folgenden Aufbau:

Java:
Bekleidung;Hose;kurz;gelb;
Bekleidung;Hose;kurz;rot;
Bekleidung;Hose;lang;blau;ohne Taschen;
Bekleidung;Hose;lang;blau;mit Taschen;
Bekleidung;Hose;lang;schwarz;ohne Taschen;
Bekleidung;Jacke;Jeans;schwarz;

Den Aufbau im Baum kann sich nun jeder vorstellen.

Wie kann ich das ganze nun in einer Hierarchie/Baumstruktur darstellen, ohne JTree nutzen zu müssen?

Also mit "darstellen" meine ich im Speicher und nicht auf dem Bildschirm. Die Hierarchie soll später in einer Datenbank mit Parent-IDs geschrieben werden;(

Danke für eure Anregungen.
 

Marco13

Top Contributor
Im Zweifelsfall mit einer eigenen "TreeNode"-Klasse, ziemlich straightforward. Warum HashMap? Wie soll darauf denn zugegriffen (oder wie soll damit rumgerechnet) werden?
 

Lumaraf

Bekanntes Mitglied
Ich würde statt einer HashMap eher auf eine TreeMap setzen. Aus der Reihenfolge der Einträge läßt sich dann auch ziemlich einfach eine Baumstruktur aufbauen.
 
S

SlaterB

Gast
eine Map ist für mich da auch die natürliche Wahl
"Bekleidung" zeigt auf Liste mit Strings "Hose", "Jacke",
"Hose" -> "lang", "Kurz"
usw.

eigene Klassen mit Nachfolgerlisten usw. sind sicherlich Alternative
 

Resthirn

Mitglied
eine Map ist für mich da auch die natürliche Wahl
"Bekleidung" zeigt auf Liste mit Strings "Hose", "Jacke",
"Hose" -> "lang", "Kurz"
usw.

ja genau. Nur leider scheine ich zu blöd zu sein, einen Schleifendurchlauf zu programmieren, um die HashMaps in der entsprechenden Hierarchie abzubilden damit das dann so aussiehht :(

Code:
HashMap - Key "Bekleidung"
     |
     +--- Hashmap - Key "Hosen"
               |
               +--- HashMap - Key "kurz"
               |         |
               |         +--- HashMap - Key "gelb"
               |         +--- HashMap - Key "blau"
               |
               +--- HashMap - Key "lang"
                         |
                         +--- HashMap - Key "schwarz"
                         +--- HashMap - Key "blau"
 
Zuletzt bearbeitet:

faetzminator

Gesperrter Benutzer
Wenn du mit Maps arbeitest, hast du aber das Problem, dass du immer (mit [c]instanceof[/c] oder [c]getClass()[/c]) testen musst, ob denn der aktuelle Node ein Endknoten mit Daten, ein weiterer Knoten (Map) oder noch nichts (null) ist.
Wenn du dir eine eigene Datenstruktur schreibst, kannst du sogar noch so tolle Sachen wie [c]toString()[/c], [c]insert(String path)[/c] oder [c]T get(String path)[/c] anbieten ;)
 

Resthirn

Mitglied
ja, okay. Aber mein größtes Problem ist überhaupt die Hierarchie abzubilden?!

Woher weiß ich denn im Schleifendurchlauf, dass z.B. "schwarz" ein Child von "lang", das wiederum ein Child von "Hose" und das wiederum ein Child von "Bekleidung" ist?:(
 
Zuletzt bearbeitet:
S

Spacerat

Gast
Maps? No...
Perhaps you might implement something like that: ;) (Tschuldigung... lerne grad' englisch XD)
Java:
public interface Node<T extends Node<T, V>, V> extends Set<T> {
  V getValue();
  V setValue(V value);
}
 

andreT

Aktives Mitglied
[OT]
Maps? No...
Perhaps you might implement something like that: ;) (Tschuldigung... lerne grad' englisch XD)
Java:
public interface Node<T extends Node<T, V>, V> extends Set<T> {
  V getValue();
  V setValue(V value);
}
Was soll mir eine Aussage wie "Die Hierarchie soll später in einer Datenbank mit Parent-IDs geschrieben werden" genau sagen? Ich finde die Antwort passt schon ganz gut zur Frage/Problemstellung :D
[/OT]

Aber jetzt mal ehrlich : Wie GENAU soll die Datenstruktur auf der DB denn nachher aussehen? Ist die vorgegeben oder nach deinem Ermessen? Was soll hier Parent-ID im o.g. Kontext (Parent-ID von was?) heißen?
Im Moment schaut mir die Objektstruktur erstmal ziemlich trivial aus und ich frage mich warum du da so einen Aufriss draus machen willst/sollst?! Was ist da dein Ziel bzw. wo soll "die Reise" hingehen ?
 
S

SlaterB

Gast
ja, okay. Aber mein größtes Problem ist überhaupt die Hierarchie abzubilden?!

Woher weiß ich denn im Schleifendurchlauf, dass z.B. "schwarz" ein Child von "lang", das wiederum ein Child von "Hose" und das wiederum ein Child von "Bekleidung" ist?:(

beim Aufbau der Map/ sonstigen Datenstruktur weißt du es direkt aus den Rohdaten, aus einer Zeile
> Bekleidung;Hose;lang;schwarz
baust jede Verbindung einzeln auf,

was später bei der Auswertung der Map/ sonstigen Datenstruktur haben willst, musst du erstmal in Worte fassen,
allgemein hangelst du dich von Verknüpfung zu Verknüpfung
 

Resthirn

Mitglied
Also ich bekomme eine CSV in dem Aufbau oben mit rund 2000 Kategorien geliefert:

Code:
KATEGORIE_EBENE1;KATEGORIE_EBENE2;KATEGORIE_EBENE3;KATEGORIE_EBENE4;KATEGORIE_NAME1
KATEGORIE_EBENE1;KATEGORIE_EBENE2;KATEGORIE_EBENE3;KATEGORIE_EBENE4;KATEGORIE_NAME2
KATEGORIE_EBENE1;KATEGORIE_EBENE2;KATEGORIE_EBENE3;KATEGORIE_EBENE4;KATEGORIE_EBENE5;KATEGORIE_NAME1

Daraus brauche ich den Hierarchiebaum. Mit dem Hierarchiebaum kenne ich dann den Parent und kann einen neuen Datensatz in meine Tabelle Schreiben. Diese Tabelle hat folgenden Aufbau:

Code:
ID|NAME|PARENT_ID

Und nun?



beim Aufbau der Map/ sonstigen Datenstruktur weißt du es direkt aus den Rohdaten, aus einer Zeile
> Bekleidung;Hose;lang;schwarz
baust jede Verbindung einzeln auf,

was später bei der Auswertung der Map/ sonstigen Datenstruktur haben willst, musst du erstmal in Worte fassen,
allgemein hangelst du dich von Verknüpfung zu Verknüpfung

ja aber die Verschachtelung ist dynamisch tief. mal 5 Ebenen, mal 2 oder mal 13. Und ich bekomme den Aufbau mit der dynamischen Tiefe nicht hin. Bei einer Starren Tiefe von z.B. 3 Ebenen wäre das kein Problem...
 

bERt0r

Top Contributor
Wie wärs mit
Java:
class Kategorie
{
HashMap<Kategorie> subKategorien;
String bezeichnung;

//get,set,Konstruktor
}
 

Resthirn

Mitglied
Wie wärs mit
Java:
class Kategorie
{
HashMap<Kategorie> subKategorien;
String bezeichnung;

//get,set,Konstruktor
}

ja klar. aber ich kriege das nicht gebacken das in der Schleife aufzubauen.

mit

Code:
KATEGORIE_EBENE1;KATEGORIE_EBENE2;KATEGORIE_EBENE3;KATEGORIE_EBENE4;KATEGORIE_NAME1
KATEGORIE_EBENE1;KATEGORIE_EBENE2;KATEGORIE_EBENE3;KATEGORIE_EBENE4;KATEGORIE_NAME2
KATEGORIE_EBENE1;KATEGORIE_EBENE2;KATEGORIE_EBENE3;KATEGORIE_EBENE4;KATEGORIE_EBENE5;KATEGORIE_NAME1

hätte ich eine Schleife mit 3 Durchläufen, und in jedem Durchlauf hätte ich ein String-Array mit 5 bzw. 7 Inhalten.

Wie baue ich nun die Verschachtelung mit den Subkategorien dann auf?
 

andreT

Aktives Mitglied
Also ich bekomme eine CSV in dem Aufbau oben mit rund 2000 Kategorien geliefert:

Code:
KATEGORIE_EBENE1;KATEGORIE_EBENE2;KATEGORIE_EBENE3;KATEGORIE_EBENE4;KATEGORIE_NAME1
KATEGORIE_EBENE1;KATEGORIE_EBENE2;KATEGORIE_EBENE3;KATEGORIE_EBENE4;KATEGORIE_NAME2
KATEGORIE_EBENE1;KATEGORIE_EBENE2;KATEGORIE_EBENE3;KATEGORIE_EBENE4;KATEGORIE_EBENE5;KATEGORIE_NAME1

Daraus brauche ich den Hierarchiebaum. Mit dem Hierarchiebaum kenne ich dann den Parent und kann einen neuen Datensatz in meine Tabelle Schreiben. Diese Tabelle hat folgenden Aufbau:

Code:
ID|NAME|PARENT_ID

Und nun?

Du stellst dir doch wohl keinen Datensatz à la ID|NAME|PARENT_ID <-> 42|gelb|0815 vor wobei 0815 die ID von sowas wie kurz ist, oder? Wenn doch, würd ich nochmal gründlich über das Datenmodell nachdenken!

ja aber die Verschachtelung ist dynamisch tief. mal 5 Ebenen, mal 2 oder mal 13. Und ich bekomme den Aufbau mit der dynamischen Tiefe nicht hin. Bei einer Starren Tiefe von z.B. 3 Ebenen wäre das kein Problem...

Beliebig tiefe Verschachtelungen sind eigtl. nicht das Problem wenn man mit Bäumen arbeitet. Die kann man sich (wie ja schon vorgeschlagen wurde) auch selbst basteln. Hier mal ein paar Lösungsansätze (siehe Links im Thread) :
http://www.java-forum.org/java-basics-anfaenger-themen/134367-klasse-fuer-baumstrukturen.html
// Zwar ein Binärer Suchbaum, macht es aber ggf. noch klarer bzw. optimierter.
JAVA Tutorial Deutsch #60 - Binärer Suchbaum [GER] [HD] - YouTube
 

Resthirn

Mitglied
Du stellst dir doch wohl keinen Datensatz à la ID|NAME|PARENT_ID <-> 42|gelb|0815 vor wobei 0815 die ID von sowas wie kurz ist, oder? Wenn doch, würd ich nochmal gründlich über das Datenmodell nachdenken!

wieso das denn? Mehr brauche ich nicht außer den Namen und die ID von dem Parent.

Wenn das alles so einfach ist, dann schreib mir doch bitte einer den Code wie ich die Hierarchie mit HashMaps aus den 3 oben genannten Zeilen bekomme damit das dann so aussieht:

Code:
HashMap - Key "Bekleidung"
     |
     +--- Hashmap - Key "Hosen"
               |
               +--- HashMap - Key "kurz"
               |         |
               |         +--- HashMap - Key "gelb"
               |         +--- HashMap - Key "blau"
               |
               +--- HashMap - Key "lang"
                         |
                         +--- HashMap - Key "schwarz"
                         +--- HashMap - Key "blau"

Mit dem JTree habe ich das ja fertig, bekomme es aber mit den HashMaps nicht hin...
 

faetzminator

Gesperrter Benutzer
Ist doch in 5min geschrieben ;)
Java:
import java.util.LinkedHashMap;
import java.util.Map;

public class Node {

    private final Map<String, Node> children = new LinkedHashMap<String, Node>();

    private final String key;

    protected static final String NEW_LINE = System.getProperty("line.separator");

    public Node(String key) {
        this.key = key;
    }

    public String getKey() {
        return key;
    }

    public Map<String, Node> getChildren() {
        return children;
    }

    public Node getChild(String key) {
        return children.get(key);
    }

    public void addChild(Node child) {
        children.put(child.getKey(), child);
    }

    @Override
    public String toString() {
        return getStringBuilder(0).toString();
    }

    protected StringBuilder getStringBuilder(final int n) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++) {
            sb.append(' ');
        }
        sb.append("- " + getKey() + NEW_LINE);
        for (Node entry : getChildren().values()) {
            sb.append(entry.getStringBuilder(n + 2));
        }
        return sb;
    }
}
Java:
public static void main(String[] args) {
    final Node root = new Node("root");
    add(root, "KATEGORIE_EBENE1;KATEGORIE_EBENE2;KATEGORIE_EBENE3;KATEGORIE_EBENE4;KATEGORIE_NAME1");
    add(root, "KATEGORIE_EBENE1;KATEGORIE_EBENE2;KATEGORIE_EBENE3;KATEGORIE_EBENE4;KATEGORIE_NAME2");
    add(root,
            "KATEGORIE_EBENE1;KATEGORIE_EBENE2;KATEGORIE_EBENE3;KATEGORIE_EBENE4;KATEGORIE_EBENE5;KATEGORIE_NAME1");
    System.out.println(root);
}

public static void add(final Node root, String input) {
    Node current = root;
    for (String key : input.split(";")) {
        Node child = current.getChild(key);
        if (child == null) {
            current.addChild(child = new Node(key));
        }
        current = child;
    }
}
Was gibts aus?
Code:
- root
  - KATEGORIE_EBENE1
    - KATEGORIE_EBENE2
      - KATEGORIE_EBENE3
        - KATEGORIE_EBENE4
          - KATEGORIE_NAME1
          - KATEGORIE_NAME2
          - KATEGORIE_EBENE5
            - KATEGORIE_NAME1
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Java Call-Hierarchie Allgemeine Java-Themen 2
Landei Vererbung Vererbungs-Hierarchie von Wrappern Allgemeine Java-Themen 8
D Datenstruktur für Hierarchie/Baum mit Tiefe 3 Allgemeine Java-Themen 8
T Klassendesign - Hierarchie Ebenen Allgemeine Java-Themen 15
G Hierarchie der Javaklassen Allgemeine Java-Themen 3
OnDemand Java String in Hashmap als Key NULL Allgemeine Java-Themen 27
T HashMap values Bearbeitung Allgemeine Java-Themen 4
T Hashmap Values Bearbeitung Allgemeine Java-Themen 1
JavaJakob22 Bestimmte HashMap importieren Allgemeine Java-Themen 4
killig HashMap mit if-Anweisung überprüfen Allgemeine Java-Themen 4
killig Textdatei einlesen und in HashMap speichern (duplikate entfernen) Allgemeine Java-Themen 12
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
L HashMap Allgemeine Java-Themen 10
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
B HashMap Duplikate Allgemeine Java-Themen 4
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
W Array vs. ArrayList vs. HashMap Allgemeine Java-Themen 20
F Tabelle aus CSV, 2 dimensionale HashMap? Allgemeine Java-Themen 4
D Mit Java PHP hashmap lesen Allgemeine Java-Themen 1
H Swing HashMap zu Tabelle macht mir Probleme Allgemeine Java-Themen 4
B HashMap aus Value Key bekommen Allgemeine Java-Themen 2
N HashMap und Methoden richtig einbinden Allgemeine Java-Themen 2
J Problem bei Hashmap Key-Abfrage Allgemeine Java-Themen 4
X JSONObject auslesen und in HashMap hinterlegen Allgemeine Java-Themen 16
N Werte aus Hashmap auslesen und übertragen Allgemeine Java-Themen 8
JavaWolf165 JsonObject in HashMap umwandeln Allgemeine Java-Themen 16
R ArrayList und HashMap Allgemeine Java-Themen 7
L Assoziatives Datenfeld, schneller wie Hashmap Allgemeine Java-Themen 35
G Methoden HashMap speichert unter falschen Schlüsseln Allgemeine Java-Themen 6
D Verschachtelte HashMap initializieren Allgemeine Java-Themen 1
L Variablen HashMap nimmt value nicht an Allgemeine Java-Themen 3
D Datentypen HashCollision in HashMap Allgemeine Java-Themen 3
Z Concurrent Modification Exception - HashMap (kein remove) Allgemeine Java-Themen 4
B Zugriff auf eine HashMap Allgemeine Java-Themen 4
B Userdaten in Hashmap speichern - Servlet Allgemeine Java-Themen 6
T Hashmap mit geordneter/ungeordneter liste als Value Allgemeine Java-Themen 5
I HashMap key wird nicht erkannt trotz überschriebener equals/hashCode Methode Allgemeine Java-Themen 6
M Füllfaktor einer Hashmap Allgemeine Java-Themen 7
A Collections HashMap.containsKey findet keine immutablen Objekte Allgemeine Java-Themen 3
D Datentypen HashMap Allgemeine Java-Themen 5
R Collections Performance einer HashMap Allgemeine Java-Themen 26
C LinkedList und ArrayList in HashMap Allgemeine Java-Themen 4
T Erste Schritte HashMap<String, int> Allgemeine Java-Themen 2
K Hashmap sortieren Allgemeine Java-Themen 6
F HashMap überschreibt Daten von anderen HashMap Allgemeine Java-Themen 5
S HashMap containsKey liefert immer false zurück Allgemeine Java-Themen 15
H Problem beim Sortieren einer HashMap mit TreeSet Allgemeine Java-Themen 4
K HashMap sorting verhindern Allgemeine Java-Themen 10
J Generic von einer ArrayList/HashMap bekommen Allgemeine Java-Themen 7
L HashMap mit Enum Keys Allgemeine Java-Themen 3
J Array als Schlüssel für HashMap Allgemeine Java-Themen 6
S Geschwindigkeit HashMap oder .getParent Allgemeine Java-Themen 5
V Hashmap-Frage Allgemeine Java-Themen 3
M HashMap - Ich bin verwirrt Allgemeine Java-Themen 3
H2SO3- multiple Hashmap Allgemeine Java-Themen 5
K Threading - schreiben auf Hashmap/löschen - ConcurrentModificationException Allgemeine Java-Themen 3
J NullPointerException mit HashMap Allgemeine Java-Themen 2
V Probleme mit eigener Hashmap Allgemeine Java-Themen 10
N HashMap<String,Vector<String>> a = new HashMap<String,Vector<String>>(); Allgemeine Java-Themen 4
I HashMap Problem... Allgemeine Java-Themen 3
C HashMap Allgemeine Java-Themen 12
Daniel_L Map/HashMap - Reihenfolge von Einträgen Allgemeine Java-Themen 4
L HashMap Key Reihenfolge umkehren Allgemeine Java-Themen 8
N wie greife ich auf hashmap in vector zu Allgemeine Java-Themen 9
J Inhalt von HashMap vergleichen Allgemeine Java-Themen 3
Z Serialisierung und Deserialisierung einer HashMap Allgemeine Java-Themen 17
P Wieso HashMap-Zugriff mit Object, statt mit MyObject? Allgemeine Java-Themen 12
K Serialisierung von Hashmap in Vector Allgemeine Java-Themen 3
T Hashmap füllen mit rs sortierung Allgemeine Java-Themen 9
D HashMap sortieren Allgemeine Java-Themen 2
P Große Datenmenge wie speichern (HashMap? TreeMap?) Allgemeine Java-Themen 11
D HashMap Problem Allgemeine Java-Themen 14
G Runnables aus Hashmap starten Allgemeine Java-Themen 4
J java.util.ConcurrentModificationException bei HashMap? Allgemeine Java-Themen 2
G HashMap key ändern Allgemeine Java-Themen 5
L HashMap / Objekte auf Festplatte zur Laufzeit auf HD swappen Allgemeine Java-Themen 7
S Problem mit Hashmap Allgemeine Java-Themen 2
G Datei einlesen und in HashMap verarbeiten Allgemeine Java-Themen 3
E Auslesen aus Hashmap Allgemeine Java-Themen 3
P HashMap mit mehreren gleichen keys Allgemeine Java-Themen 4
alexpetri hashmap bästpractice Allgemeine Java-Themen 4
J HashMap mit Webservice realisierbar? Allgemeine Java-Themen 4
ARadauer hashmap vs hastable Allgemeine Java-Themen 5
T HashMap#values Reihenfolge Allgemeine Java-Themen 13
M ArrayList sortieren - HashMap mit sort_id vorhanden Allgemeine Java-Themen 2
L Wie kann ich eine HashMap abspeichern? Allgemeine Java-Themen 3
T HashMap (String, Object(String , int)) nach int sortieren Allgemeine Java-Themen 7
M HashMap kapselt zwei Objekte aber wie baut man eine Matrix? Allgemeine Java-Themen 2
E MySQL-Datenbank <-> HashMap/TreeMap Allgemeine Java-Themen 1
P List in Hashmap schreiben Allgemeine Java-Themen 5
M Threads in einer Hashmap Allgemeine Java-Themen 5
P HashMap an 2 Stellen veränderbar Allgemeine Java-Themen 13
P HashMap auflösen Allgemeine Java-Themen 9
MQue HashMap durchlaufen Allgemeine Java-Themen 2
MQue HashMap Allgemeine Java-Themen 2
M HashMap kommt beim Löschen aus dem Tritt Allgemeine Java-Themen 6
MQue HashMap Allgemeine Java-Themen 6
MQue HashMap Allgemeine Java-Themen 9
MQue Sichtbarkeit/HashMap/NullPointerexception Allgemeine Java-Themen 2
B HashMap.containsKey. Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben