Учитывая список String, например:
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
Как я могу создать древовидную структуру с первой частью строк в качестве родительских ключей? Ограничение, которое у меня есть, заключается в том, что он должен быть в 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.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());