本
文介绍如何使用递归方法将一个嵌套的Java对象(表示树形结构的类别)转换为一个字符串数组,其中每个字符串代表从根节点到叶子节点的完整路径。这种方法避免了使用Java 8 Stream API的复杂性,提供了一种更简洁易懂的解决方案。
在处理具有父子关系的嵌套数据结构时,递归是一种非常有效的策略。 递归的核心思想是将问题分解为更小的、与原始问题结构相同的子问题,直到达到基本情况,然后逐步合并结果。 在本例中,基本情况是节点没有子节点(即叶子节点),此时我们将当前路径添加到结果列表中。
以下代码展示了如何使用递归方法将嵌套的CategoryTreeDto对象转换为字符串数组。
import lombok.Data;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@Data
class CategoryTreeDto {
private String name;
private List childrenItems;
}
public class Test {
public static void main(String[] args) throws IOException {
// 模拟数据,实际应用中从数据源获取
List list = new ArrayList<>();
CategoryTreeDto pantry = new CategoryTreeDto();
pantry.setName("Pantry");
CategoryTreeDto butter = new CategoryTreeDto();
butter.setName("Butter");
CategoryTreeDto cream = new CategoryTreeDto();
cream.setName("Cream");
butter.setChildrenItems(List.of(cream));
CategoryTreeDto snack = new CategoryTreeDto();
snack.setName("Snack");
pantry.setChildrenItems(List.of(butter, snack));
CategoryTreeDto medicine = new CategoryTreeDto();
medicine.setName("Medicine");
list.add(pantry);
list.add(medicine);
List 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 result) {
List children = dto.getChildrenItems();
if (children == null || children.isEmpty()) {
result.add(current);
return;
}
for (CategoryTreeDto childDto : dto.getChildrenItems()) {
String next = current + "->" + childDto.getName();
traverse(childDto, next, result);
}
}
} 代码解释:
使用递归方法展平嵌套对象是一种简洁而有效的解决方案,特别是在处理树形结构的数据时。 通过理解递归的基本原理和注意事项,可以更好地应用它来解决实际问题。 这种方法不仅易于理解和实现,而且可以避免使用复杂的Stream API。