以树形式呈现数据

时间:2009-06-28 08:45:42

标签: java tree

我从服务器获得这样的信息,并且必须以树形结构向用户呈现信息。来自服务器的数据采用以下形式:

APP          net        main 
Account      net        main
Address      net        main
APP          net        main 
Person       book       optel
Person       book       ggggg
Person       book       show 
Bindings     apple      parse
Bindings     apple      findProject
Bindings     apple      show 

列的位置不固定。第一列可以成为第二列或第三列,具体取决于用户的偏好。

在每一行中,第一个数据必须是第二个数据的父级,第二个数据必须是第三个数据的父级,如果似乎有第四个数据,那么它将是第三个数据的子级就这样。

当我循环来自服务器的信息时,我必须能够构建这种树状结构。

它从左侧(列)开始,这意味着左列将是第一个父级。我必须以类似树的形式从服务器提供信息:

APP
  net
     main

Account
    net
       main

...

 Bindings
   apple
       show

etc...

可选要求: 如果可能的话,我还必须能够使用该结构来创建表格。我的一位朋友建议使用链接列表,但我不知道他是否正确,如果他是对的,我该如何使用它。

3 个答案:

答案 0 :(得分:1)

您可以使用JTree向用户显示树状结构。您有一个示例here。这是一个如何看起来的图像,看看它是否是你想要的:

JTree
(来源:sun.com

如果要使用上述字符串,可以使用StringTokenizer和树模型来构建结构。很简单。

答案 1 :(得分:1)

步骤1,将数据解析为表结构。

您需要一个简单的对象来表示Tree节点。这是一个起点:

// Implement a classic tree "Node" class
abstract class Node {
    String label;
    Map<String, Node> childNodes;

    abstract Node getChild(String label);
    abstract void addChild(Node child);
}

以下是使用此结构将输入解析为树的方法:

Node root = new Node("root");

Reader r = new InputStreamReader(new BufferedInputStream(...));

String line;

while ((line = r.readLine) != null) {
    String[] colunms = line.split("\\s*");
    // Read in the data in tabular form

    // Build a tree structure of Node objects

    // NOTE: This could be optimized quite a bit to take
    // advantage of the sorted input.

    Node curr = null;
    Node prev = root;
    for (int i = 0; i < columns.length; i++) {
        curr = prev.getChild(columns[i]);

        // If this node has not been seen yet, create it
        if (curr == null) {
             curr = new Node(columns[i]);
             prev.addChild(curr);
        }
        prev = curr;
    }
}

在此之后,您将所有数据附加到根节点。要显示表,您可以反转此过程,执行深度优先遍历并将每个节点的完整路径打印为输出列。

对于一棵树,你已经拥有了这个结构。如果您将现有的Model类调整为Node对象(例如,Swing),那么您只需将树数据传递给JTreeNode即可。否则,以其他方式转换树是很简单的(例如,渲染为静态HTML或在Web浏览器中渲染为JSON)。

答案 2 :(得分:0)

如果它只是表示,你实际上不必将它们存储在持久内存中,因此你实际上并不需要数据结构。 (除非明确说明你需要使用它们)

只是一个想法,以及如果只给出你指定的约束我将如何处理这个问题。我假设您已经知道如何按行读取它们。对于第一行,请考虑如何将单个单词划分为自己的“节点”。 (提示:Java有一个String.split()函数)。还有其他方法可以做到。

之后,将它们存储在某个地方,数组或其他内容中,只要您能按顺序将它们恢复。链接列表也会这样,队列也是如此。

在循环打印时,在它们之间添加换行符和一些空格以创建输出外观。然后,您甚至可以回收先前为下一行声明的数组。祝你好运!