diff --git a/pom.xml b/pom.xml index 14e3fb6..d3e3262 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,5 @@ - 4.0.0 com.getintent.interview @@ -7,7 +7,17 @@ 1.0 jar - + + junit + junit + 4.8.1 + test + + + org.apache.commons + commons-lang3 + 3.1 + diff --git a/src/main/java/com/getintent/interview/TreeNode.java b/src/main/java/com/getintent/interview/TreeNode.java index 164fb79..9f81d7d 100644 --- a/src/main/java/com/getintent/interview/TreeNode.java +++ b/src/main/java/com/getintent/interview/TreeNode.java @@ -11,7 +11,16 @@ public TreeNode(int value) { this.value = value; } - public void addChild(TreeNode child) { + public int getValue() { + return value; + } + + public List getChildren() { + return children; + } + + public TreeNode addChild(TreeNode child) { children.add(child); + return this; } } diff --git a/src/main/java/com/getintent/interview/TreeParser.java b/src/main/java/com/getintent/interview/TreeParser.java new file mode 100644 index 0000000..9591ac6 --- /dev/null +++ b/src/main/java/com/getintent/interview/TreeParser.java @@ -0,0 +1,39 @@ +package com.getintent.interview; + +import org.apache.commons.lang3.StringUtils; + +/** + * Created by Kraynov M. on 11/12/13. + */ +public class TreeParser { + int lastLine = 1; + + private static TreeNode parseLine(String line) { + return new TreeNode(Integer.parseInt(line)); + } + + public TreeNode parse(String s) { + String[] lines = s.split("\\r?\\n"); + String firstLine = lines[0]; + TreeNode root = parseLine(firstLine); + parse(root, 0, lines); + return root; + } + + private void parse(TreeNode parent, int depth, String[] lines) { + for (; lastLine < lines.length; ) { + String nextLine = lines[lastLine]; + int spaceNumber = StringUtils.countMatches(nextLine, " "); + if (spaceNumber < depth) { + break; + } + String value = nextLine.trim(); + TreeNode node = parseLine(value); + lastLine++; + if (parent != null) { + parent.addChild(node); + } + parse(node, spaceNumber + 1, lines); + } + } +} diff --git a/src/main/java/com/getintent/interview/TreePrinter.java b/src/main/java/com/getintent/interview/TreePrinter.java new file mode 100644 index 0000000..531281d --- /dev/null +++ b/src/main/java/com/getintent/interview/TreePrinter.java @@ -0,0 +1,30 @@ +package com.getintent.interview; + +import java.io.IOException; +import java.io.Writer; +import java.util.Iterator; + +/** + * Created by Kraynov M. on 11/12/13. + */ +public class TreePrinter implements TreeWriter { + + private static void write(TreeNode node, String spaceNumber, Writer w) throws IOException { + if (node == null) { + return; + } + w.append(spaceNumber + node.getValue() + "\n"); + for (Iterator iter = node.getChildren().iterator(); iter.hasNext(); ) { + write(iter.next(), spaceNumber + " ", w); + } + } + + @Override + public void write(TreeNode node, Writer w) { + try { + write(node, "", w); + } catch (IOException e) { + System.out.println("Error was occurred while writing tree" + e.getMessage()); + } + } +} diff --git a/src/test/java/TestTreeParserAndWriter.java b/src/test/java/TestTreeParserAndWriter.java new file mode 100644 index 0000000..5dea85b --- /dev/null +++ b/src/test/java/TestTreeParserAndWriter.java @@ -0,0 +1,55 @@ +import com.getintent.interview.TreeNode; +import com.getintent.interview.TreeParser; +import com.getintent.interview.TreePrinter; +import junit.framework.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import java.io.StringWriter; +import java.util.Arrays; +import java.util.Collection; + +/** + * Created by Kraynov M. on 11/12/13. + */ +@RunWith(value = Parameterized.class) +public class TestTreeParserAndWriter { + private static String tree1 = "6\n" + + " 7\n" + + " 3\n" + + " 4\n" + + " 10\n" + + " 13\n" + + " 16\n" + + " 21\n"; + private static String tree2 = "6\n" + + " 7\n" + + " 8\n"; + private static String tree3 = "6\n" + + " 7\n" + + " 8\n" + + " 9\n" + + " 10\n"; + private String treeString; + + public TestTreeParserAndWriter(String treeString) { + this.treeString = treeString; + } + + @Parameterized.Parameters + public static Collection data() { + Object[][] data = new Object[][]{{tree1}, {tree2}, {tree3}}; + return Arrays.asList(data); + } + + @Test + public void testParseAndWrite() { + TreeParser parser = new TreeParser(); + TreeNode parsedTree = parser.parse(treeString); + TreePrinter printer = new TreePrinter(); + StringWriter writer = new StringWriter(); + printer.write(parsedTree, writer); + Assert.assertEquals("Parser or Writer is not correct!", treeString, writer.toString()); + } +} diff --git a/src/test/java/TestTreePrinter.java b/src/test/java/TestTreePrinter.java new file mode 100644 index 0000000..164bbca --- /dev/null +++ b/src/test/java/TestTreePrinter.java @@ -0,0 +1,37 @@ +import com.getintent.interview.TreeNode; +import com.getintent.interview.TreePrinter; +import junit.framework.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.io.StringWriter; + +/** + * Created by Kraynov M. on 11/12/13. + */ +public class TestTreePrinter { + private static String tree1 = "6\n" + + " 7\n" + + " 3\n" + + " 4\n" + + " 10\n" + + " 13\n" + + " 16\n" + + " 21\n"; + private TreeNode treeNode1; + + @Before + public void init() { + treeNode1 = new TreeNode(6).addChild(new TreeNode(7).addChild(new TreeNode(3).addChild(new TreeNode(4)))) + .addChild(new TreeNode(10)) + .addChild(new TreeNode(13).addChild(new TreeNode(16)).addChild(new TreeNode(21))); + } + + @Test + public void testWrite() { + TreePrinter printer = new TreePrinter(); + StringWriter writer = new StringWriter(); + printer.write(treeNode1, writer); + Assert.assertEquals("Writer is not correct!", tree1, writer.toString()); + } +}