使用 BSON 和 Java 构建树结构

building a treestructure with BSON and Java

给出的字符串列表如下:

A
A.1
A.1.B
A.1.B.X
A.1.B.X
A.1.B.X
A.1.B.X
A.1.C
A.1.C.Y
A.1.C.Y
A.1.C.Y

如何将字符串的第一部分作为 parent 键来构建树结构? 我有一个限制是它需要在 BSON 中,因为它必须进入 MongoDB 并且我不允许使用额外的自定义 objects 并且我还有一些额外的数据要保存。 BSON 文档必须类似于:

{id:A, parentId:null, children:[{id:A.1,parentId:A, children:[{id:A.1.B, parentId:A.1, children[...]}, ...]},...]}

编辑: 回答: 为了解决这个问题,我采用了 bij Zavior 给出的答案来构建我的基本元素。

Map<String, Map<String, Object>> map = new HashMap<>()

在那之后,我拿到了我的地图列表并通过它们进行了解析。我查看了条目是否有 parentId,如果有,我将其添加到 parent 的 children 列表中。我使用 Map 来存储 id 和元素。

map.entrySet().stream().forEach(entry -> {
        Map<String, Object> treeObject = entry.getValue();
        String parentId = (String)treeObject.get("parent");
        if (StringUtils.isNotBlank(parentId)) {
            Map<String, Object> parent = map.get(parentId);
            ((List<Map<String, Object>>)parent.get("children")).add(treeObject);
        }
    });

当我构建树时,我找到了 parents。

List<Map<String, Object>> result = map.values().stream().filter(entry -> StringUtils.isBlank((String) entry.get("parent"))).collect(Collectors.toList());

MongoDB 的 BasicDBObject 有一个接受映射的构造函数。我只会使用普通的 java HashMap<String, Object> 来构建结构并将其传递给构造函数。

像这样:

map.put("id", "A");
map.put("parent", null);
map.put("children", listOfChildren);

请注意,在您的示例中,您有一个子列表,因此您将创建一个地图列表并将其作为列表传递。

childMap.put("id", "A1");
childMap.put("parent", "A");
childMap.put("children", <another list of maps>);
listOfChildren.add(childMap):