Created
September 13, 2016 14:40
-
-
Save deyindra/ffd215005de6f8cbcd8de20f61682153 to your computer and use it in GitHub Desktop.
Serialize and DeSerialize of N-Array Tree
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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