让我们假设Category
本身可能还有另一个子类别,这些子类别可能具有类似的行为,依此类推。如何为另一个Category
中的每个Category
提供最有效的旅行?
public class Category {
private Category parentCategory;
private Map<String, Category> subcategories;
private String name;
// ...
}
我尝试的代码:
public void showSubcategoriesRecursively() {
System.out.println(this.getName());
if (!this.getSubcategories().isEmpty()) {
for (Map.Entry<String, Category> entry : this.getSubcategories().entrySet()) {
entry.getValue().showSubcategoriesRecursively();
}
}
}
我不知道如何返回父级Category
并采用另一个尚未被访问的子类别。
我希望Category
被称为Automotive
,并且子类别如Car
和Motocycle
和Car
具有另一个子类别:Nissan
和{{1} }。 Toyota
具有子类别:Motocycle
和Aprilia
,输出应如下所示:
Suzuki
答案 0 :(得分:3)
您可以简单地使用它:
private static void showSubcategoriesRecursively(Category category) {
System.out.println(category.getName());
category.getSubcategories().values().forEach(YourClass::showSubcategoriesRecursively);
}
这将递归遍历所有子项并打印所需的值。
要使其成为Category
的公共方法,请使用以下方法:
public void showSubcategoriesRecursively() {
System.out.println(this.name);
this.subcategories.values().forEach(Category::showSubcategoriesRecursively);
}
如果要在子类别的开头使用空格,可以在Category
中使用以下两种方法:
public void showSubcategoriesRecursively() {
showSubcategoriesRecursively(0);
}
private void showSubcategoriesRecursively(int index) {
String spaces = IntStream.range(0, index).mapToObj(i -> "\t|_").collect(Collectors.joining());
System.out.println(spaces + getName());
getSubcategories().values().forEach(c -> c.showSubcategoriesRecursively(index + 1));
}
结果将是这样:
Automotive
|_Car
| |_Nissan
| | |_primera
| | |_gtr
| |_Toyota
|_Motocycle
|_Aprilia
| |_rs125
| |_sr150
|_Suzuki