一尘不染

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

java

我最近在求职的实际测试中面对这个问题。

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

**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

现在,从上面的平面数据结构中,我们想要显示类似下面的分层树结构的内容。

 -Electronics
|   -Television
|   |   -21 inch
|   |   -23 inch
|   |   -lcd display
|   -Player
|   |   -mp3player
|   |   -vcdplayer
|   |   | -HD display
|   |   -DVD player

然后,如果我要向我的数组添加另一个条目,例如:

11                 Test               3

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

所以对于我目前正在使用的这类东西ArrayList,可以遍历到第二级,但是不能遍历第三级。那么执行此操作的最佳方法是什么?

谢谢

编辑:

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


阅读 360

收藏
2020-12-03

共1个答案

一尘不染

以下是一些示例代码,这些代码使用递归在层次结构中列出了它们。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;
}

可能有一种更有效的方法,但这可行。

然后,当您要将新项目添加到层次结构时,请执行以下操作:

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

对于实际的显示,我只是传递了一个“选项卡级别”,其中说出了选项卡输入的距离,然后为每个孩子增加它,如下所示:

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

这给了我这个:

-electronics
    -Television
        -21inch
            -Test
        -23inch
        -LCD display
    -player
        -mp3player
        -vcd player
            -hd quality
        -dvd player
2020-12-03