Перемещать каждый объект внутри другого объекта в HashMap? - PullRequest
0 голосов
/ 07 июня 2019

Предположим, что 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 & Toyota. Motocycle имеет подкатегории: Aprilia & Suzuki вывод должен быть таким:

Automotive
         |_Car
         |   |_Nissan
         |   |      |_primera
         |   |      |_gtr
         |   |_Toyota
         |_Motocycle
                   |_Aprilia
                   |       |_rs125
                   |       |_sr150
                   |_Suzuki

1 Ответ

3 голосов
/ 07 июня 2019

Вы можете просто использовать это:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...