I want to generate a tree from an array(such as String), but I don't know how to do it.
My input array:
[a, f, d, s]
[a, f, w]
[b, r]
[a, p]
[b, n, l]
I want to make a tree like this:
Root
b
r
n
l
a
f
w
d
s
p
This is my code so far:
public class TreeGenerator {
public TreeGenerator(E root, E[][] array){
List list = Arrays.asList(array);//makes list
Set set = new HashSet(list);//then set
Node tree = new Node(root, set, 0);//makes whole tree
System.out.println(tree.toString());//displays tree
}
public static void main(String[] args) {
String[][] array = new String[][] { { "a", "f", "d", "s" }, { "a", "f", "w" }, { "b", "r" }, { "a", "p" }, { "b", "n", "l" } };
for(String[] s : array){
System.out.println(Arrays.toString(s));
}
new TreeGenerator("Root", array);
}
}
public class Node {
private final E nodeName;
private final Node[] children;
private final int depth;
/**
* Constructs a Node and its children.
*
* @param name Node name
* @param array Set of arrays
* @param depth Index of arrays
*/
public Node(E name, Set array, int depth) {
nodeName = name;
this.depth = depth;
Map map = new HashMap();
for (E[] line : array) { //iterates over arrays
if (line.length > depth) { //checks if an element exists at this depth
E common = line[depth]; //gets an element
Set branch = map.get(common); //gets a branch for the element
if (branch == null) { //if first such an element
branch = new HashSet(); //creates branch
map.put(common, branch); //adds for the element
}
branch.add(line); //adds the line for proper branch
}
}
children = new Node[map.size()];
int i = 0;
depth++;//gets deeper
for (Map.Entry entry : map.entrySet()) {//iterates over map
children[i] = new Node(entry.getKey(), entry.getValue(), depth);//makes child
i++;
}
}
}
You're code is a bit chaotic and you should most definitly not create the entire structure recursively in the constructor of
Node. So i've provided some pseudocodeThough this form of representation is rather inefficient and will produce gigantic amounts of data for bigger balanced trees.