1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
public class Node<T> extends AbstractList<Node<T>> implements RandomAccess {
private T value;
private Node<T> parent;
private List<Node<T>> children = new ArrayList<Node<T>>();
protected Node(T value, Node<T> parent) {
this.value = value;
this.parent = parent;
}
public Node(T value) {
this(value, null);
}
public Node() {
this(null);
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
public Node<T> getParent() {
return parent;
}
protected void setParent(Node<T> parent) {
this.parent = parent;
}
public boolean isRoot() {
return getParent() == null;
}
public Node<T> getRoot() {
Node<T> parent = getParent();
if (isRoot()) return this;
return parent.getRoot();
}
protected List<Node<T>> getChildren() {
return children;
}
public boolean isLeaf() {
return getChildren().isEmpty();
}
@Override
public int size() {
return getChildren().size();
}
@Override
public Node<T> get(int index) {
return getChildren().get(index);
}
@Override
public void add(int index, Node<T> child) {
Node<T> root = child.getRoot();
if (root != null) {
throw new IllegalArgumentException(child + " is already attached to the tree [root: " + root + "]");
}
child.setParent(this);
getChildren().add(index, child);
}
@Override
public boolean remove(Object o) {
if (o != null && o instanceof Node) {
Node<T> node = (Node<T>) o;
Iterator<Node<T>> children = getChildren().iterator();
while (children.hasNext()) {
Node<T> child = children.next();
if (child == node) {
child.setParent(null);
children.remove();
return true;
}
}
}
return false;
}
@Override
protected void removeRange(int fromIndex, int toIndex) {
List<Node<T>> children = getChildren().subList(fromIndex, toIndex);
for (Node<T> child : children) {
child.setParent(null);
}
children.clear();
}
@Override
public Node<T> set(int index, Node<T> child) {
Node<T> root = child.getRoot();
if (root != null) {
throw new IllegalArgumentException(child + " is already attached to the tree [root: " + root + "]");
}
Node<T> old = getChildren().set(index, child);
child.setParent(this);
old.setParent(null);
return old;
}
@Override
public int hashCode() {
return (getValue() != null ? getValue().hashCode() : 0) + 2 * ((getChildren().hashCode()));
}
@Override
public boolean equals(Object o) {
if (o == null || !(o instanceof Node)) return false;
Node<T> node = (Node<T>) o;
return
(getValue() == node.getValue() || (getValue() != null && getValue().equals(node.getValue()))) &&
getChildren().equals(node.getChildren());
}
@Override
public String toString() {
return "node[" + getValue() + ";" + getChildren() + "]";
}
}
public enum Color { WHITE, BLACK; }
public enum Shape { CIRCLE, SQUARE; }
public class NodeProperty {
private Color color = Color.WHITE;
private Shape shape = Shape.CIRCLE;
public Color getColor() {
return this.color;
}
public void setColor(Color color) {
this.color = color;
}
public Shape getShape() {
return this.shape;
}
public void setShape(Shape shape) {
this.shape = shape;
}
} |
Partager