Skip to content

Instantly share code, notes, and snippets.

@deyindra
Created September 13, 2016 14:40
Show Gist options
  • Save deyindra/ffd215005de6f8cbcd8de20f61682153 to your computer and use it in GitHub Desktop.
Save deyindra/ffd215005de6f8cbcd8de20f61682153 to your computer and use it in GitHub Desktop.
Serialize and DeSerialize of N-Array Tree
//Class Represent NArrayTreeNode
public class NArrayTreeNode<E> {
private E data;
private List<NArrayTreeNode<E>> childs = new ArrayList<>();
public NArrayTreeNode(E data) {
this.data = data;
}
public NArrayTreeNode<E> addChild(NArrayTreeNode<E> child){
this.childs.add(child);
return this;
}
public List<NArrayTreeNode<E>> getChilds() {
return childs;
}
public E getData() {
return data;
}
@Override
public String toString() {
StringBuilder builder=new StringBuilder();
builder.append(data.toString());
for(NArrayTreeNode child:childs){
builder.append(child.toString());
}
return builder.toString();
}
}
//TreeDeSerializer Interface
public interface TreeDeSerialize<E> {
E deserialize(String value);
}
//TreeSerializer Interface
public interface TreeSerialize<E> {
String serialize(E e);
}
public class NArrayTreeSerDe<E> {
private TreeDeSerialize<E> deSerialize;
private TreeSerialize<E> serialize;
private static final String MARKER= "#";
public NArrayTreeSerDe(TreeDeSerialize<E> deSerialize, TreeSerialize<E> serialize) {
this.deSerialize = deSerialize;
this.serialize = serialize;
}
public String serialize(NArrayTreeNode<E> root) {
StringBuilder sb = new StringBuilder();
String seperator="";
buildString(root,sb,seperator);
return sb.toString();
}
private void buildString(NArrayTreeNode<E> node, StringBuilder sb, String seperator) {
if (node == null) {
return;
}
String str = serialize.serialize(node.getData());
sb.append(seperator).append(str);
for(NArrayTreeNode<E> child:node.getChilds()){
buildString(child,sb,",");
}
sb.append(",").append(MARKER);
}
public NArrayTreeNode<E> deserialize(String data, String seperator) {
Deque<String> nodes = new LinkedList<>();
nodes.addAll(Arrays.asList(data.split(seperator)));
return buildTree(nodes);
}
private NArrayTreeNode<E> buildTree(Deque<String> nodes) {
String val = nodes.remove();
if (val.equals(MARKER)) return null;
NArrayTreeNode<E> node = new NArrayTreeNode<>(deSerialize.deserialize(val));
while (!nodes.isEmpty()){
NArrayTreeNode<E> child = buildTree(nodes);
if(child!=null)
node.addChild(child);
else
break;
}
return node;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment