从Flat List生成嵌套列表(树)

时间:2013-12-23 06:15:56

标签: java algorithm list data-structures

我在Java中有一个名为MenuModel的普通类(顾名思义就是嵌套菜单),如下所示:

public class MenuModel {
    public String id;
    public String parentId = null;
    public String title;

    public MenuModel parent = null;
    public List<MenuModel> children = new ArrayList<MenuModel>(); 
 }

我的代码从Web API获取数据并生成一个MenuModel的平面列表,其中只有idparentIdtitle字段填充了数据。但是,我需要每个MenuModel引用其父级和(可选)子级以供进一步使用

我想到了一个方法,它使一个嵌套循环将模型相互配对,并检查它们是否是父和子。但我认为成本太高(n ^ 2或n ^ 3复杂度,项目集很大)并且只能填充parent字段。

在Java中实现这一目标的最佳方法是什么?总结一下:

  • 输入:ArrayList<MenuModel> source
  • 输出:ArrayList<MenuModel> result包含来自源的所有MenuModel,其中包含parentId = null(也就是说,它是顶级菜单),每个MenuModel都有子字段,其中填充了对各自子项MenuModel的引用。此外,每个孩子都提到了他们的父母。

提前致谢

1 个答案:

答案 0 :(得分:6)

浏览所有记录并将其添加到HashMap<String, MenuModel>(密钥为ID)。

然后,对于每条记录record

  • 在上面的地图中查找父ID以获取parent
  • 将父级分配给此记录的父级变量 - record.parent = parent
  • 将此记录添加到父级的孩子列表中 - parent.children.add(record)

运行时间:预期为O(n)。