Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将修改后的前序树遍历数据填充到Java树对象中?_Java_Php_Tree_Populate_Mptt - Fatal编程技术网

如何将修改后的前序树遍历数据填充到Java树对象中?

如何将修改后的前序树遍历数据填充到Java树对象中?,java,php,tree,populate,mptt,Java,Php,Tree,Populate,Mptt,我有一个MPTT结构的下表: 创建不存在的表格菜单( id int(10)无符号非空自动增量, 父id int(10)默认为空, lft int(10)默认为空, rght int(10)默认为空, 模块名称varchar(255)默认为空, 模块\控制器\名称varchar(128)默认为空, 模块\操作\名称varchar(128)默认为空, 别名varchar(128)默认为空, 主键(id) )引擎=InnoDB; 插入菜单(`id`、`parent\u id`、`lft`、`rght`

我有一个MPTT结构的下表:

创建不存在的表格菜单(
id int(10)无符号非空自动增量,
父id int(10)默认为空,
lft int(10)默认为空,
rght int(10)默认为空,
模块名称varchar(255)默认为空,
模块\控制器\名称varchar(128)默认为空,
模块\操作\名称varchar(128)默认为空,
别名varchar(128)默认为空,
主键(id)
)引擎=InnoDB;
插入菜单(`id`、`parent\u id`、`lft`、`rght`、`module\u name`、,
`模块控制器名称、模块动作名称、别名)值(1,NULL,1,14,
'根','','','根',
(2,1,2,7,“工具箱”,“工具箱”),
(3、2、5、6,‘菜单管理’、‘菜单’、‘索引’、‘菜单管理’,
(4,2,3,4,'Hak Akses Manajemen','access_rights','index','hakakses Manajemen'),
(5,1,8,13,“账户”,“账户”),
(6、5、9、10,‘用户’、‘用户’、‘索引’、‘用户’),
(7,5,11,12,‘组’、‘组’、‘索引’、‘组’);
在CakePHP中,我可以创建以下数据结构:

数组
(
[0]=>阵列
(
[菜单]=>阵列
(
[id]=>2
[parent_id]=>1
[lft]=>2
[rght]=>7
[模块名称]=>工具箱
[模块\控制器\名称]=>
[模块\u操作\u名称]=>
[别名]=>工具箱
)
[子项]=>数组
(
[0]=>阵列
(
[菜单]=>阵列
(
[id]=>4
[家长id]=>2
[lft]=>3
[rght]=>4
[模块名称]=>Hak Akses Manajemen
[模块控制器名称]=>访问权限
[模块动作名称]=>索引
[别名]=>Hakaksemanajemen
)
[子项]=>数组
(
)
)
[1] =>阵列
(
[菜单]=>阵列
(
[id]=>3
[家长id]=>2
[lft]=>5
[rght]=>6
[模块名称]=>菜单管理
[模块\控制器\名称]=>菜单
[模块动作名称]=>索引
[别名]=>MenuManajemenz
)
[子项]=>数组
(
)
)
)
)
)
问题是如何使用Java树类在Java中填充MPTT数据结构。是的,我知道Java不能像PHP那样拥有动态数组,在Java中你必须使用类模型

我的模型类如下所示:

公共类菜单{
私有字符串moduleName;
私有字符串模块控制器名;
私有字符串moduleActionName;
私有字符串别名;
公共字符串getModuleName(){
返回模块名;
}
公共void setModuleName(字符串moduleName){
this.moduleName=moduleName;
}
公共字符串getModuleControlName(){
返回模块控制器名;
}
public void setModuleControlName(字符串ModuleControlName){
this.moduleControllerName=moduleControllerName;
}
公共字符串getModuleActionName(){
返回moduleActionName;
}
public void setModuleActionName(字符串moduleActionName){
this.moduleActionName=moduleActionName;
}
公共字符串getAlias(){
返回别名;
}
public void setAlias(字符串别名){
this.alias=别名;
}
}
我觉得很困惑,我不知道怎么做。来自数据库的数据被填充到Java树对象中。我不知道该怎么做,我不知道如何完全填充它。我正在使用


我想我需要数据查询策略,是否需要一个递归函数来检索数据库中的所有数据?我认为这需要两个步骤:1。查询数据,2。将所有数据填充到树对象

您可能需要添加一个
私有菜单实例变量,这样您就可以对树结构建模了

您实际上不需要通用的树数据结构。考虑下面的例子:

private static final class Menu {
    private Menu parent;
    private List<Menu> children;

    private String moduleName;
    private String moduleControllerName;
    private String moduleActionName;
    private String alias;
}
至于find
findMenuById
,它可能类似于:

private Menu findMenuById(Menu menu, Long id) {
    if (menu.getId() == id) return menu;
    for (Menu childMenu : menu.getChildren()) {
        Menu found = findMenuById(childMenu, id);
        if (found != null) return found;
    }
    return null;
}
编辑 这是我制作的一个自定义工作实现。我将菜单插入数据库并使用结果集。我应该和你的习惯抽象差不多

Menu root = null;
        Map<Integer, Menu> menus = new HashMap<Integer, Menu>();

        final Database databaseConnection = Database.createConnection("test", "root", "");
        final ResultSet rs = databaseConnection.executeQuery("SELECT * FROM test.menus;");
        while ( rs.next() ) {
            final Menu menu = new Menu(rs.getInt("id"))
                .setAlias(rs.getString("alias"))
                .setModuleName(rs.getString("module_name"));

            final Integer parentId = rs.getInt("parent_id");
            if (root == null && parentId == 0) {
                root = menu;
            } else {
                menus.get(parentId).addSubMenu(menu);
            }

            menus.put(menu.getId(), menu);
        }

        rootMenu = root;

        databaseConnection.closeConnection();
菜单根=null;
映射菜单=新建HashMap();
最终数据库databaseConnection=Database.createConnection(“test”、“root”和“”);
最终结果集rs=databaseConnection.executeQuery(“从test.menus中选择*”;
while(rs.next()){
最终菜单=新菜单(rs.getInt(“id”))
.setAlias(rs.getString(“别名”))
.setModuleName(rs.getString(“模块名称”);
最终整数parentId=rs.getInt(“parent_id”);
if(root==null&&parentId==0){
根=菜单;
}否则{
menus.get(parentId).addSubMenu(menu);
}
menu.put(menu.getId(),menu);
}
根菜单=根;
databaseConnection.closeConn
Menu root = null;
        Map<Integer, Menu> menus = new HashMap<Integer, Menu>();

        final Database databaseConnection = Database.createConnection("test", "root", "");
        final ResultSet rs = databaseConnection.executeQuery("SELECT * FROM test.menus;");
        while ( rs.next() ) {
            final Menu menu = new Menu(rs.getInt("id"))
                .setAlias(rs.getString("alias"))
                .setModuleName(rs.getString("module_name"));

            final Integer parentId = rs.getInt("parent_id");
            if (root == null && parentId == 0) {
                root = menu;
            } else {
                menus.get(parentId).addSubMenu(menu);
            }

            menus.put(menu.getId(), menu);
        }

        rootMenu = root;

        databaseConnection.closeConnection();