Java многоуровневая структура меню - PullRequest
2 голосов
/ 18 августа 2011

Я создаю веб-приложение на Java (Tapestry 5).Я хочу создать многоуровневое меню, в котором я могу отображать корневые элементы, например, в верхней части моей страницы, а потомки выбранных слева.

Для реализации этого я думал использовать древовидную структуру, напримерэто:

public class SiteMap {

private List<MenuItem> root;

public class MenuItem {

    private String pageFileName;
    private String pageNavigationName;

    private List<MenuItem> children;
    private MenuItem parent;

    public MenuItem(String pageFileName, String pageNavigationName, MenuItem parent) {
        this.pageFileName = pageFileName;
        this.pageNavigationName = pageNavigationName;
        this.parent = parent;
    }

    public String getPageFileName() {
        return pageFileName;
    }

    public String getPageNavigationName() {
        return pageNavigationName;
    }

    public List<MenuItem> getChildren() {
        return children;
    }

    public MenuItem getParent() {
        return this.parent;
    }
}
}

А что если я хочу построить меню, основанное на дочерних элементах одного родительского элемента (только с pageFileName - String) где-нибудь в дереве.Придется рекурсивно пройти по дереву, чтобы найти этот родительский элемент на основе pageFileName (String), что, кажется, не очень хороший способ.

Является ли это (с использованием древовидной структуры) правильным способом реализации этого?Или есть лучший вариант?Любые мысли и советы приветствуются!

Заранее спасибо!

Натан

Ответы [ 2 ]

0 голосов
/ 18 августа 2011
MenuItem root = null;
MenuItem curr = myMenuItem;
while(curr.getParent() != null) {
    curr = curr.getParent(); 
}
root = curr;

В этом нет ничего плохого, этот код будет работать очень быстро, особенно если у вас не будет миллионов пунктов меню.

0 голосов
/ 18 августа 2011

Почему бы не использовать MenuItem для родителей и дочерних элементов и хранить ссылку от каждого дочернего элемента на своего родителя?

List<MenuItem> children; // empty/null for leaf nodes
MenuItem parent; // null for root nodes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...