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

2022-09-03 06:55:41

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

假设您得到一个平面数据结构,如下所示:

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

然后它应该显示下面的条目。Test21inch

因此,对于这种东西,我目前正在使用并且已经能够遍历到第二级,但对于第三级却无法这样做。那么,什么是做到这一点的完美方法呢?ArrayList

谢谢

编辑:

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


答案 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

答案 2

你可以有一个灵感来自Swing TreeModel的设计

编辑当我这么说时,我的意思是你可以使用一个实现类似接口的类;请注意,您甚至可以直接使用此接口,因为Swing是标准JRE的一部分,并且可以在标准Java可用的地方使用。

此外,由于它是一个接口(而不是一个类),它只是您构建调用的一种方式。因此,您可以在基于控制台的应用程序中轻松使用它。


推荐