当前位置: 首页 > 面试题库 >

解析Java中的缩进文本树

鱼征
2023-03-14
问题内容

我有一个缩进文件,需要使用java进行解析,我需要某种方式将其放在Section类中,如下所示

    root
     root1
       text1
         text1.1
         text1.2
       text2
         text2.1
         text2.2

     root2
       text1
         text1.1
         text1.2
       text2
         text2.1
         text2.2.2

我有上课的地方像缩进的东西

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;
 }
}

我需要一些方法来解析文件并将其放在预期的结果中,这是我们的Section对象,如下所示

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;

}

问题答案:

我也添加了一个父指针。也许不用它也可以解析文本,但是父指针使它更容易。首先,您需要具有更多的构造函数:

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;
}

然后,当您开始解析文件时,请逐行读取它:

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);
        }
    }
}

我已经掩盖了伪代码的一些细节,但我认为您已经获得了如何进行此解析的总体思路。请记住要实现addChild(),getDepth(),getParent()等方法。



 类似资料:
  • CSS提供了许多强有力的文本格式化工具,可以用来设定字体、颜色、字号、行距的呢过,它还有许多其他属性,可以给标题、列表、段落等添加视觉效果。 文本缩进 在CSS中,使用 text-indent属性,可以让元素第一行缩进一个给定的宽度,可能是最常见的文本格式化效果。语法格式为: text-indent: <length> | <pecentage> 也就是说,可以使用长度值或百分比来设置文本缩进,长

  • 问题内容: 我有一个包含以下行的文本文件: 每个“ |” 符号表示它有一列。我必须从“ |”内部的每一行中提取信息 迹象。当我尝试以下代码时: 它给了我: 如何正确解析? 问题答案: 试试这个:

  • 给定以下代码 输出如下(注意前导空格): 如何获得下面这样的字符串值(没有不必要的前导空格)?

  • 问题内容: 我正在尝试解压缩一些zip文件,它的大小约为65兆。下面的代码段: 此方法实际上将文件解压缩: 那个执行者/未来的东西只是为了确保我正确地做。在类Finder中调用此方法,该类在目录中查找zip文件并尝试将其解压缩。它基于此代码http://docs.oracle.com/javase/tutorial/essential/io/walk.html 具体来说: 现在的问题。真的很有趣。

  • 我有一个包含员工信息的文本文件。第一个单词是员工的姓氏,第二个单词是第一个名字。字符代码h或s告诉我他们是什么样的员工,有薪或小时。最后,字符代码后面的数字是小时工资(如果为小时工)或年薪(如果为受薪员工)。 我想对这些信息做的是扫描文本文件,根据识别的字符代码自动创建新的受薪员工对象或小时员工对象。 这些是小时雇员对象的参数。 这就是我想到的。 这段代码的问题是,我从in.nextDouble(

  • 我有这个文件要处理,我正试图找出如何将第二行作为不同的对象来读取。在这一行的末尾,最后一项是公交车的数量。第二行、第四行等应包含idBus和noOfBus,并用逗号分隔。 基于这些课程 我想要一个函数来处理CSV文件中所有公交车和大学线路的列表。它必须使用流API。我不知道这是否可能或如何进行。 当然,可以根据类进行更改,但保留变量,不添加任何额外内容。 我认为最方便的方法是浏览文件,根据两个班级