使用文本文件中的输入在java中构建树

时间:2013-04-07 17:35:30

标签: java file-io tree

我正在尝试使用文件中的数据构建任意大小的树。在文件中,每个节点都是自己的行,并且分支由某些关键字分隔。目前,我正在将文件读入List,逐项阅读,并查找关键字以构建分支。在开始第一个分支后,我很难弄清楚如何继续前进。以下是我的树类和测试输入文件。我意识到测试输入可能被认为对于测试来说太大了,但实际的测试输入会有很多很多模型。最终目标是让树代表harley davidson自行车阵容,一旦完全建成,每辆自行车都有所有可用选项。例如,分支的一个部分看起来像:

Harley(root) -> Model Line -> Model 1 -> color -> c1

对于每个分支的所有其他关键字等等。我的问题是,如果我在populate()中朝着正确的方向前进。我能想到的唯一方法就是拥有一个大的if...else if...结构来连续检查每个关键字,每个if...else都有一个循环来填充该关键字节点的子节点。即使我这样做了,我也不知道如何跳起去做下一个分支,我知道这是制作树的非常低效的方法。有什么建议?谢谢。

Tree.java

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class Tree
{
    private Node root;

    public Tree(String rootData) 
    {
        root = new Node();
        root.data = rootData;
        root.children = new ArrayList<Node>();
    }

    public static class Node
    {
        private String data;
        private Node parent;
        private List<Node> children;

        public Node(){}

        public Node(String newNodeData, Node newNodeParent)
        {
            data = newNodeData;
            parent = newNodeParent;
        }
    }

    public void populate() throws IOException
    {
        //keep track of nodes for jumping up branches quickly
        Node curNode = this.root;
        Node curModelLine;
        Node curModel;

        //get the data
        List<String> fileData = getData();
        int nextDataLine = 0;
        while (!fileData.isEmpty())
        {
            String curLine = fileData.get(nextDataLine);
            if (curLine == "model line")
            {
                curModelLine = new Node(fileData.get(nextDataLine+1), this.root);
                this.root.children.add(curModelLine);    
            }

            /*Not sure where to go from here*/

            nextDataLine++;
        }
    }

    public static List<String> getData() throws IOException
    {
        List<String> filedata = new ArrayList<String>();
        try
        {
            FileInputStream in = new FileInputStream("data.txt");
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            String line;
            while((line = br.readLine())!= null)
            {
                filedata.add(line);
            }
            br.close();
        }catch(Exception e)
        {
            System.out.println(e);
        }
        return filedata;
    }
}

data.txt中:

harley
model line
linename1
modelname1
color
c1
c2
engine size
es1
es2
windsheild
w1
w2
lights
l1
l2
tire size
t1
t2
radio
r1
r2
abs
a1
a2
alarm
a1
a2
seat
s1
s2
bags
b1
b2
modelname2
color
c1
c2
engine size
es1
es2
windsheild
w1
w2
lights
l1
l2
tire size
t1
t2
radio
r1
r2
abs
a1
a2
alarm
a1
a2
seat
s1
s2
bags
b1
b2
linename2
modelname1
color
c1
c2
engine size
es1
es2
windsheild
w1
w2
lights
l1
l2
tire size
t1
t2
radio
r1
r2
abs
a1
a2
alarm
a1
a2
seat
s1
s2
bags
b1
b2
modelname2
color
c1
c2
engine size
es1
es2
windsheild
w1
w2
lights
l1
l2
tire size
t1
t2
radio
r1
r2
abs
a1
a2
alarm
a1
a2
seat
s1
s2
bags
b1
b2

1 个答案:

答案 0 :(得分:0)

我不确定这是否会像您期望的那样:

      if (curLine == "model line")
      {
          curModelLine = new Node(fileData.get(nextDataLine+1), this.root);
          this.root.children.add(curModelLine);    
      }

使用此if语句,您将检查参考值;不是字符串值。要比较字符串,您应该使用equals()运算符。看起来应该更像这样:

    if (curLine.equals("model line"))
    {
        curModelLine = new Node(fileData.get(nextDataLine+1), this.root);
        this.root.children.add(curModelLine);    
    }

您的方法

对我来说,我会有一个嵌套循环。结构将是这样的:

while(not at the end of the file) {
    aLine := the next line.
    while(!aLine.equals(the end of a branch delimiter) {
        print out the next item.
        print out a "->"
    }
    print out a new line character.
}

请注意,这是伪代码。我们不是代码编写服务,但显然你付出了努力,所以我想我只是对你的代码发表意见。