如何将平面数据结构显示为分层数据结构(Java)?

har*_*alb 16 java data-structures

我最近在一份工作的实际测试中遇到了这个问题.

假设您有一个像这样的平面数据结构:

**Category**         **Name**         **Parent**
1                   electronics          0
2                   Television           1
3                    21inch              2
4                    23inch              2
5                   LCD display          2
6                   player               1
7                   mp3player            6
8                   vcd player           6
9                   dvd player           6
10                  hd quality           8
Run Code Online (Sandbox Code Playgroud)

现在从上面的平面数据结构我们想要显示类似下面的分层树结构.

 -Electronics
|   -Television
|   |   -21 inch
|   |   -23 inch
|   |   -lcd display
|   -Player
|   |   -mp3player
|   |   -vcdplayer
|   |   | -HD display
|   |   -DVD player
Run Code Online (Sandbox Code Playgroud)

然后如果我在我的数组中添加另一个条目,如:

11                 Test               3
Run Code Online (Sandbox Code Playgroud)

然后它应该显示Test下面的条目21inch.

所以对于我目前正在使用的这类东西ArrayList,它已经能够遍历到第二级但不能在第三级进行.那么这样做的最佳方式是什么?

谢谢

编辑:

我被要求仅使用基于DOS的Java应用程序构建此概念.

Mat*_*t N 10

下面是一些示例代码,使用递归在层次结构中列出它们.Item类有一个子列表.诀窍是将任何新的孩子添加到正确的父母.这是我创建的方法:

public Item getItemWithParent(int parentID){
    Item result = null;
    if(this.categoryID == parentID){
        result = this;
    } else {
        for(Item nextChild : children){
            result = nextChild.getItemWithParent(parentID);
            if(result != null){
                break;
            }
        }
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

可能有一种更有效的方法,但这是有效的.

然后,当您想要向层次结构中添加新项时,请执行以下操作:

public void addItem(int categoryID, String name, int parentID) {
    Item parentItem = findParent(parentID);
    parentItem.addChild(new Item(categoryID, name, parentID));
}
private Item findParent(int parentID) {
    return rootNode.getItemWithParent(parentID);
}
Run Code Online (Sandbox Code Playgroud)

对于实际的显示,我只是传入一个"标签级别",它表示标签的距离,然后为每个孩子递增,如下所示:

public String toStringHierarchy(int tabLevel){
    StringBuilder builder = new StringBuilder();
    for(int i = 0; i < tabLevel; i++){
        builder.append("\t");
    }
    builder.append("-" + name);
    builder.append("\n");
    for(Item nextChild : children){
        builder.append(nextChild.toStringHierarchy(tabLevel + 1));
    }
    return builder.toString();
}
Run Code Online (Sandbox Code Playgroud)

这给了我这个:

-electronics
    -Television
        -21inch
            -Test
        -23inch
        -LCD display
    -player
        -mp3player
        -vcd player
            -hd quality
        -dvd player
Run Code Online (Sandbox Code Playgroud)