Java 以树的形式显示数据

Java 以树的形式显示数据,java,tree,Java,Tree,我从服务器上获得了类似的信息,并且必须以树形结构向用户呈现这些信息。来自服务器的数据以以下形式提供: APP net main Account net main Address net main APP net main Person book optel Person book ggggg Person book

我从服务器上获得了类似的信息,并且必须以树形结构向用户呈现这些信息。来自服务器的数据以以下形式提供:

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...
可选要求: 如果可能的话,我还必须能够使用这个结构来创建一个表。我的一个朋友建议使用链表,但我不知道他是否正确,他是否正确,我该如何使用它。

你可以使用一个链接表向用户显示树结构。你有一个例子。这是一张图片,展示了它的样子,看看它是否是你想要的:


(来源:)


如果要使用上面提到的字符串,可以将与树模型一起使用来构建结构。非常简单。

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

这只是一个想法,以及在您指定的约束条件下我将如何解决这个问题。我想你已经知道如何逐行阅读了。对于第一行,考虑如何将单个单词分解为自己的“节点”。(提示:Java有一个String.split()函数)。还有其他方法可以做到这一点

之后,将它们存储在某个地方,以数组或其他形式,只要您能够将它们按顺序恢复。链表也可以,队列也可以


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

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

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

// 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);
}
//实现一个经典的树“节点”类
抽象类节点{
字符串标签;
映射子节点;
抽象节点getChild(字符串标签);
抽象void addChild(节点子节点);
}
下面是我如何使用此结构将输入解析到树中的方法:

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;
    }
}
节点根=新节点(“根”);
读取器r=新的InputStreamReader(新的BufferedInputStream(…);
弦线;
while((line=r.readLine)!=null){
字符串[]colunms=line.split(\\s*);
//以表格形式读入数据
//构建节点对象的树结构
//注意:这可以进行一些优化
//排序输入的优点。
节点curr=null;
节点prev=根;
for(int i=0;i
在此之后,所有数据都将附加到根节点。要显示表,可以反转此过程,执行深度优先遍历,并将每个节点的完整路径打印为输出列


对于一棵树,你已经有了结构。如果将现有模型类改编为节点对象(例如Swing),那么只需将树数据交给JTreeNode即可。否则,以其他方式转换树(例如,以静态HTML格式呈现,或以JSON格式在web浏览器中呈现)非常简单。

感谢您的回复以及所有花时间回复的其他人。我的帖子漏了一点。我从服务器获得的数据是对象数组(Object[]),数组中的每个元素也是一个数组。所以我循环了一下数组,把它呈现给你们看。很抱歉,我没有在我的帖子中提到这一点。我不会像字符串一样读取它们,而是从对象数组中读取它们。谢谢你的回复。它使我的思想开阔了很多。欢迎提出任何其他建议。谢谢