Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -1,13 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.getintent.interview</groupId>
<artifactId>javatest1</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<dependencies>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.1</version>
</dependency>
</dependencies>
<build>
<plugins>
Expand Down
11 changes: 10 additions & 1 deletion src/main/java/com/getintent/interview/TreeNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,16 @@ public TreeNode(int value) {
this.value = value;
}

public void addChild(TreeNode child) {
public int getValue() {
return value;
}

public List<TreeNode> getChildren() {
return children;
}

public TreeNode addChild(TreeNode child) {
children.add(child);
return this;
}
}
39 changes: 39 additions & 0 deletions src/main/java/com/getintent/interview/TreeParser.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
30 changes: 30 additions & 0 deletions src/main/java/com/getintent/interview/TreePrinter.java
Original file line number Diff line number Diff line change
@@ -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<TreeNode> 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());
}
}
}
55 changes: 55 additions & 0 deletions src/test/java/TestTreeParserAndWriter.java
Original file line number Diff line number Diff line change
@@ -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<Object[]> 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());
}
}
37 changes: 37 additions & 0 deletions src/test/java/TestTreePrinter.java
Original file line number Diff line number Diff line change
@@ -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());
}
}