Tree aus Datenbank bauen

klaus1985

Mitglied
Hallo,
ich stehe vor einem Problem. Ich habe eine Datenbank in der Einträge sind, die Ordner bzw Unterordner darstellen. Sie ist nach dem "Nested Set Model" aufgebaut. Außerdem steht in jeder Tabellenzeile auch noch eine Folder-ID die ID des Parent-Ordner. Das will ich jetzt in einen TreeView hineinbekommen, bzw. eben einen Baum mit Objekten erstellen.
Dafür habe ich die Klasse "Node" erstellt, die wiederum in einem Array weitere Nodes aufnehmen kann. Das erstellen klappt auch zum Teil, sobald allerdings viele Unterordner hinzukommen, ist's vorbei.
Mit einer while-Schleife gehe ich durch das ResultSet, das mir die Tabelle liefert. Mit folgender Funktion versuche ich den Ordner zu finden, in den der neue hineinkommen soll:
Code:
public Node getNode(Node parent, int parentFolderID, String name) 
	{
		for (Object o : parent.children) {
			if (o instanceof Node)
			{
				Node n = (Node)o;
				if (n.ID == parentFolderID)
					return n;
				else if (n.children.size() != 0)
					return getNode(n, parentFolderID, name);
			}
		}
		return null;
	}
parent ist immer der Root-Ordner (darin sind dann die anderen mit weiteren Unterordnern). Es sieht also ungefähr so aus:
root
- F1
-- F1.1
--- F1.3
-- F1.2
- F2

Wenn jetzt ein Ordner in F2 reingehört, startet die Funktion eben bei F1, geht die Unterordner durch und - aus ist's. Also nix bis F2...
 
Wenn du eine Datennbank verwendest, dann lasse dir den Pfad doch als einzelnen String von ihr liefern. Das kann man mit GROUP_CONCAT verwirklichen, hier ist ein gutes Beispiel von yaslaw.
Diesen Pfad kannst du dann als key für einen HashTree verwenden, und die einzelnen Bestandteile kannst du mit der split-Methode bekommen.
 
Das hat Spass gemacht.
Das Problem war, dass die letzte return Anweisung für den Fall dass der erste Zweig bis ins letzte Kindelement läuft null zurückgibt.

Code:
import java.util.ArrayList;
import java.util.List;

public class Rekursiv {
	public Rekursiv() {
		Node root = new Node("root");
		Node f1 = new Node("f1");
		Node f11 = new Node("f11");
		Node f12 = new Node("f12");
		Node f13 = new Node("f13");
		Node f2 = new Node("f2");
		root.children.add(f1);
		f1.children.add(f11);
		f1.children.add(f12);
		f11.children.add(f13);
		root.children.add(f2);

		Node result = getNode(root, "f2", "bla");
		System.out.println(result.id);
	}

	class Node {
		public String id;
		List<Node> children = new ArrayList<Node>();

		public Node(String _id) {
			id = _id;
		}
	}

	public Node getNode(Node parent, String parentFolderID, String name) {
		for (Object o : parent.children) {
			if (o instanceof Node) {
				Node n = (Node) o;
				if (n.id.equals(parentFolderID))
					return n;
				else if (n.children.size() != 0) {
					Node o1 = getNode(n, parentFolderID, name);
					if (null != o1) {
						return o1;
					}
				}
			}
		}
		return null;
	}

	public static void main(String[] args) {
		new Rekursiv();
	}
}
 
Zurück