我正在尝试将下面的对象转换为字符串的数组
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;
}