如何将下面的嵌套对象展平为字符串数组



我正在尝试将下面的对象转换为字符串的数组

JSON对象

输入:

[
{
"name": "Pantry",
"childrenItems": [
{
"name": "Butter",
"childrenItems": [
{
"name": "Cream",
"childrenItems": []
}
]
},
{
"name": "Snack",
"childrenItems": []
}
]
},

{
"name": "Medicine",
"childrenItems": []
}
]

所需输出:

[ "Pantry->Butter->Cream", "Pantry->Snack", "Medicine" ]

我的POJO看起来像这个

@Data
public class CategoryTreeDto {
private String name;
private List<CategoryTreeDto> childrenItems;
}

如何使用java8流API对Nested类别的JSON对象进行扁平化。

我尝试使用递归和java8flatMap函数来压平和连接字符串,但没有得到预期的输出。

它是基于父母和孩子的关系,因为餐具室是父母,它的孩子是黄油,黄油的孩子是奶油,餐具室还有另一个孩子是零食。

对于这个特定的任务,我认为递归比java流简单得多。

public class Test {
public static void main(String[] args) throws IOException {
List<CategoryTreeDto> list = //get data
List<String> result = new ArrayList<>();
for (CategoryTreeDto dto : list) {
traverse(dto, dto.getName(), result);
}
System.out.println(result);
}
private static void traverse(CategoryTreeDto dto, String current, List<String> result) {
List<CategoryTreeDto> children = dto.getChildrenItems();
if (children.isEmpty()) {
result.add(current);
return;
}
for (CategoryTreeDto childDto : dto.getChildrenItems()) {
String next = current + "->" + childDto.getName();
traverse(childDto, next, result);
}
}
}

先深入,直到没有更多的孩子,在此期间建造道路。当没有更多的子级时,将路径添加到结果并返回(这是递归的结束(。

打印

[Pantry->Butter->Cream, Pantry->Snack, Medicine]

以你为榜样。

看起来像简单的dfs算法:

public static List<String> dfs(List<CategoryTreeDto> items) {
return dfs(items, new LinkedList<>(), new ArrayList<>());
}
private static List<String> dfs(List<CategoryTreeDto> items,
Deque<String> path,
List<String> res) {
if (items == null || items.isEmpty()) {
if (!path.isEmpty()) {
res.add(String.join("->", path));
}
} else {
for (CategoryTreeDto item : items) {
path.addLast(item.getName());
dfs(item.getChildren(), path, res);
path.removeLast();
}
}
return res;
}

最新更新