Parse indented text tree in Java

algorithm, java

Solution

I added a parent pointer as well. Maybe the text can be parsed without it, but parent pointers make it easier. First of all, you need to have more constructors:

static final int root_depth = 4; // assuming 4 whitespaces precede the tree root

public Section(String text, int depth) {
    this.text     = text;
    this.depth    = depth;
    this.children = new ArrayList<Section>();
    this.parent   = null;
}

public Section(String text, int depth, Section parent) {
    this.text     = text;
    this.depth    = depth;
    this.children = new ArrayList<Section>();
    this.parent   = parent;
}

Then, when you start parsing the file, read it line by line:

Section prev = null;
for (String line; (line = bufferedReader.readLine()) != null; ) {
    if (prev == null && line begins with root_depth whitespaces) {
        Section root = new Section(text_of_line, root_depth);
        prev = root;
    }
    else {
        int t_depth = no. of whitespaces at the beginning of this line;
        if (t_depth > prev.getDepth())
            // assuming that empty sections are not allowed
            Section t_section = new Section(text_of_line, t_depth, prev);
            prev.addChild(t_section);
        }
        else if (t_depth == prev.getDepth) {
            Section t_section = new Section(text_of_line, t_depth, prev.getParent());
            prev.getParent().addChild(t_section);
        }
        else {
            while (t_depth < prev.getDepth()) {
                prev = prev.getParent();
            }
            // at this point, (t_depth == prev.getDepth()) = true
            Section t_section = new Section(text_of_line, t_depth, prev.getParent());
            prev.getParent().addChild(t_section);
        }
    }
}

I have glossed over some finer points of the pseudo-code, but I think you get the overall idea of how to go about this parsing. Do remember to implement the methods addChild(), getDepth(), getParent(), etc.

Problem

I have an indented file that I need to parsed using java, I need some way to place this in a Section class as shown below ``` root root1 text1 text1.1 text1.2 text2 text2.1 text2.2 root2 text1 text1.1 text1.2 text2 text2.1 text2.2.2 ``` I have the class for putting the indented stuff it looks like ``` public class Section { private List<Section> children; private String text; private int depth; public Section(String t) { text =t; } public List<Section> getChildren() { if (children == null) { children = new ArrayList<Section>(); } return children; } public void setChildren(List<Section> newChildren) { if (newChildren == null) { children = newChildren; } else { if (children == null) { children = new ArrayList<Section>(); } for (Section child : newChildren) { this.addChild(child); } } } public void addChild(Section child) { if (children == null) { children = new ArrayList<Section>(); } if (child != null) { children.add(child); } } public String getText() { return text; } public void setText(String newText) { text =newText; } public String getDepth() { return depth; } public void setDepth(int newDepth) { depth = newDepth; } } ``` I need some way to parse the file and place it in expected result which us a Section object which would look like below ``` Section= Text="Root" Children Child1: Text= "root1" Child1: "text1" Child1="Text 1.1" Child2="Text 1.2" Child2: "text2" Child1="Text 2.1" Child2="Text 2.2" Children Child2: Text= "root2" Child1: "text1" Child1="Text 1.1" Child2="Text 1.2" Child2: "text2" Child1="Text 2.1" Child2="Text 2.2" Here is some code that I have started int indentCount=0; while(String text = reader.readline() { indentCount=countLeadingSpaces(String word); //TODO create the section here } public static int countLeadingSpaces(String word) { int length=word.length(); int count=0; for(int i=0;i<length;i++) { char first = word.charAt(i); if(Character.isWhitespace(first)) { count++; } else { return count; } } return count; } ```

Original source