我正在嘗試將以下物件轉換為字串陣列
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;
}
如何使用 java 8 流 API 展平嵌套類別的 JSON 物件。
我嘗試使用遞回和 java 8 flatMap 函式來展平和連接字串,但沒有得到預期的輸出。
它基于父子關系,因為 pantry 是父母,它的孩子是黃油,黃油的孩子也是奶油,而且 pantry 有另一個孩子是零食。
uj5u.com熱心網友回復:
對于這個特定的任務,我認為遞回比 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]
以你為例。
uj5u.com熱心網友回復:
看起來很簡單的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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/523569.html
上一篇:讀取空白輸入甚至數字輸入
