Una struttura dati ad albero visualizzata in HTML

Questa settimana mi è capitato di sviluppare una sezione di un sito in cui era necessario visualizzare una struttura ad albero.
Così ho creato una semplice classe “Node” che permette di definire una struttura ad albero e una JSP per la relativa visualizzazione.
Di seguito includo i sorgenti “rivisitati” in modo che possiate trarne qualche spunto nel caso vi capiti un problema simile.

Il primo passo è la classe “Node”. Ho cercato di mantenere i nomi dei metodi il più esplicti possibile.
Ogni nodo ha un unico nodo “parent”. Se il nodo è la radice non ha alcun nodo genitore.
Ogni nodo può avere un indifferenziato numero di figli.
Il metodo distanceFromRoot() restituisce il numero di nodi tra il nodo radice ed il nodo su cui è stato invocato il metodo.
Il metodo isLastChild() restituisce true se il nodo su cui è invocato il metodo è l’ultimo nodo figlio del nodo padre…

Tutte le librerie che hanno a che fare con strutture ad albero utilizzano concetti del tipo figlio, genitore, avo, discendente, ecc…
In questo caso il metodo isLastChild() dovrebbe forse chiamarsi èIlFiglioMinore() :-)

package com.danidemi.tree;
	
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
	
public final class Node {
	
	private Node parent = null;
	private List<Node>childs = new ArrayList<Node>();
	
	private String id;
	private String label;
	
	public Node(String id) {
		this(id, id);
	}
	
	public Node(String id, String label) {
		if (id == null) {
			throw new IllegalArgumentException(\"null id.\");
		}
		if (label == null) {
			throw new IllegalArgumentException(\"null label.\");
		}
	
		this.id = id;
		this.label = label;
	}
	
	public Node getParent() {
		return parent;
	}
	
	private void setParent(Node n) {
		if (n != parent) {
			this.parent = n;
			n.addChild(this);
		}
	}
	
	public Node[] getChilds() {
        return childs.toArray(new Node[childs.size()]);
	}
	
	public void addChild(Node child) {
		if (child == null) {
			throw new IllegalArgumentException(\"null child.\");
		}
	
		if (!childs.contains(child)) {
			childs.add(child);
			child.setParent(this);
		}
	}
	
	public String getId() {
		return id;
	}
	
	public String getLabel() {
		return label;
	}
	
	public int distanceFromRoot() {
		if (parent == null) {
			return 0;
		}
        return (parent.distanceFromRoot() + 1);
	}
	
	public Node find(String searchedId) {
		Node found = null;
		if (id.equals(searchedId)) {
			found = this;
		} else if (childs != null && childs.size() > 0) {
			Iterator i = childs.iterator();
			while (found == null && i.hasNext()) {
				found = ((Node) i.next()).find(searchedId);
			}
		} else {
			found = null;
		}
		return found;
	}
	
	public boolean isLastChild() {
		boolean result = false;
		if (getParent() != null) {
			Node[] siblings = getParent().getChilds();
			result = siblings[siblings.length - 1] == this;
		}
		return result;
	}
	
}

Pages: 1 2 3

Leave a Reply

You must be logged in to post a comment.