如何将修改后的前序树遍历数据填充到Java树对象中?
我有一个MPTT结构的下表:如何将修改后的前序树遍历数据填充到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`
创建不存在的表格菜单(
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;
}
至于findfindMenuById
,它可能类似于:
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();