在HashMap中的另一个对象中移动每个对象?

时间:2019-06-06 21:39:14

标签: java dictionary recursion hashmap

让我们假设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,并且子类别如CarMotocycleCar具有另一个子类别:Nissan和{{1} }。 Toyota具有子类别:MotocycleAprilia,输出应如下所示:

Suzuki

1 个答案:

答案 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