2015-11-27 22 views
1

一个treestructure鉴于像字符串列表:建设有BSON和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 

我如何才能让一棵树stucture与字符串作为母密钥的第一部分? 我有一个约束,它需要在BSON中,因为它必须进入MongoDB,我不允许使用额外的自定义对象,并且我还有一些额外的数据要保存。 的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,如果是的话,我将它添加到了该父条目的子项列表中。我用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); 
     } 
    }); 

当我构建树时,我找到了父母。

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

回答

1

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): 
+0

而我将如何得到一个这样的树结构?或者BasicDBObject为我做这件事吗? – bobK

+0

@bobK基本上你只是嵌套集合。看到我的最新编辑 – Zavior

+0

这就是我陷入困境,计算正确的水平儿童。哈希映射虽然是一个很好的提示:) – bobK