首先来看看数据库里的数据(这是一个菜单的数据,含多级):
要求从数据库里取出所有数据,并组合成以下格式:
组合的规则如下(JSON格式):
[{"ID":1,"PID":0,"TEXT":"首页","CHILDREN":[{"ID":2,"PID":1,"TEXT":"用户管理","CHILDREN":[{"ID":5,"PID":2,"TEXT":"用户列表"},{"ID":6,"PID":2,"TEXT":"添加用户"},{"ID":7,"PID":2,"TEXT":"修改密码"}]},{"ID":3,"PID":1,"TEXT":"资源管理","CHILDREN":[{"ID":8,"PID":3,"TEXT":"资源列表"},{"ID":9,"PID":3,"TEXT":"增加资源"}]},{"ID":4,"PID":1,"TEXT":"权限管理","CHILDREN":[{"ID":10,"PID":4,"TEXT":"权限列表"},{"ID":11,"PID":4,"TEXT":"增加权限"},{"ID":12,"PID":4,"TEXT":"删除权限"}]}]}]格式化后的JSON格式:[
    {
        "ID": 1,
        "PID": 0,
        "TEXT": "首页",
        "CHILDREN": [
            {
                "ID": 2,
                "PID": 1,
                "TEXT": "用户管理",
                "CHILDREN": [
                    {
                        "ID": 5,
                        "PID": 2,
                        "TEXT": "用户列表"
                    },
                    {
                        "ID": 6,
                        "PID": 2,
                        "TEXT": "添加用户"
                    },
                    {
                        "ID": 7,
                        "PID": 2,
                        "TEXT": "修改密码"
                    }
                ]
            },
            {
                "ID": 3,
                "PID": 1,
                "TEXT": "资源管理",
                "CHILDREN": [
                    {
                        "ID": 8,
                        "PID": 3,
                        "TEXT": "资源列表"
                    },
                    {
                        "ID": 9,
                        "PID": 3,
                        "TEXT": "增加资源"
                    }
                ]
            },
            {
                "ID": 4,
                "PID": 1,
                "TEXT": "权限管理",
                "CHILDREN": [
                    {
                        "ID": 10,
                        "PID": 4,
                        "TEXT": "权限列表"
                    },
                    {
                        "ID": 11,
                        "PID": 4,
                        "TEXT": "增加权限"
                    },
                    {
                        "ID": 12,
                        "PID": 4,
                        "TEXT": "删除权限"
                    }
                ]
            }
        ]
    }
]用JAVA语言写出其转换的程序?

解决方案 »

  1.   

    补充一点:
    从数据库取出来的字符串如下:{ID:1,PID:0,TEXT:"首页"},{ID:2,PID:1,TEXT:"用户管理"},{ID:3,PID:1,TEXT:"资源管理"},{ID:4,PID:1,TEXT:"权限管理"},{ID:5,PID:2,TEXT:"用户列表"},{ID:6,PID:2,TEXT:"添加用户"},{ID:7,PID:2,TEXT:"修改密码"},{ID:8,PID:3,TEXT:"资源列表"},{ID:9,PID:3,TEXT:"增加资源"},{ID:10,PID:4,TEXT:"权限列表"},{ID:11,PID:4,TEXT:"增加权限"},{ID:12,PID:4,TEXT:"删除权限"}
      

  2.   

    额  用组合模式写了个比较搓的 lz参照下吧  
    package com.djk.design.compent;import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;public class MyTest
    {
    public static void main(String[] args) 
    {
    //存放PID
    Set<String> pidSet =new HashSet<String>();
    //这里我们自己直接加入按道理应该是从数据库中读取
    pidSet.add("1");
    pidSet.add("2");
    pidSet.add("3");
    pidSet.add("4");
    //这边也模拟从数据哭中读取
    List<MyCompentMenu> list = new ArrayList<MyCompentMenu>();
    MyCompentMenu shouye = new MyMenu("1",null,"首页");
    MyCompentMenu userManager = new MyMenu("2","1","用户管理");
    MyCompentMenu resourceManager =new MyMenu("3","1","资源管理");
    MyCompentMenu roleManager = new MyMenu("4","1","权限管理");
    MyCompentMenu user = new MyMenu("5","2","用户列表");
    MyCompentMenu addUser = new MyMenu("6","2","添加用户");
    MyCompentMenu modifyUser = new MyMenu("7","2","修改用户");
    MyCompentMenu resource = new MyMenu("8","3","资源列表");
    MyCompentMenu addResource = new MyMenu("9","3","增加资源");
    MyCompentMenu role = new MyMenu("10","4","权限列表");
    MyCompentMenu addRole = new MyMenu("11","4","增加权限");
    MyCompentMenu deleteRole = new MyMenu("12","4","删除权限");
    list.add(shouye);
    list.add(userManager);
    list.add(resourceManager);
    list.add(roleManager);
    list.add(user);
    list.add(addUser);
    list.add(modifyUser);
    list.add(resource);
    list.add(addResource);
    list.add(role);
    list.add(addRole);
    list.add(deleteRole);
    Map<String,MyCompentMenu> map = new HashMap<String, MyCompentMenu>();
    for(MyCompentMenu menu :list)
    {
    MyMenu m =(MyMenu) menu;
    //如果为空则说明是最高的节点
    if(null==m.getpId())
    {
    map.put(m.getId(), m);
    }else
    {
    //如果父节点不为空则加到父节点下面
    if(null != map.get(m.getpId()))
    {
    //如果加入成功则说明他是叶子节点,不然就是子节点
    if(pidSet.add(m.getId()))
    {
    map.get(m.getpId()).add(new MyMenuItem(m.getId(),m.getpId(),m.getText()));
    map.put(m.getId(), new MyMenuItem(m.getId(),m.getpId(),m.getText()));
    }else
    {
    map.get(m.getpId()).add(m);
    map.put(m.getId(), m);
    }
    }
    }
    }
    map.get("1").print();
    }
    }/**
     * 组件菜单
     * @author djk
     *
     */
    abstract class MyCompentMenu
    {
    //增加组件
    abstract void add(MyCompentMenu compentMenu);

    //减少组件
    abstract void remove(MyCompentMenu compentMenu);

    //打印方法
    abstract void print();

    }/**
     * 叶子节点 
     * @author djk
     *
     */
    class MyMenuItem extends MyCompentMenu
    {
    //编号
    private String id;
    //父节点编号
    private String pId;
    //内容
    private String text;

    public MyMenuItem(String id,String pId,String text)
    {
    this.id = id;
    this.pId = pId;
    this.text = text;
    }

    @Override
    void add(MyCompentMenu compentMenu) {
    } @Override
    void print() {
    System.out.println("叶子节点:内容是:"+text+","+"id:"+this.id+","+"pid:"+this.pId);
    } @Override
    void remove(MyCompentMenu compentMenu) {

    }
    }/**
     * 子节点
     * @author djk
     *
     */
    class MyMenu extends MyCompentMenu
    {
    public String getId() {
    return id;
    }
    public void setId(String id) {
    this.id = id;
    }
    public String getpId() {
    return pId;
    }
    public void setpId(String pId) {
    this.pId = pId;
    }
    public String getText() {
    return text;
    }
    public void setText(String text) {
    this.text = text;
    } //编号
    private String id;
    //父节点编号
    private String pId;
    //内容
    private String text;

    public List<MyCompentMenu> getList() {
    return list;
    }
    public void setList(List<MyCompentMenu> list) {
    this.list = list;
    } private List<MyCompentMenu> list=null;

    public MyMenu(String id,String pId,String text)
    {
    this.id = id;
    this.pId = pId;
    this.text = text;
    list = new ArrayList<MyCompentMenu>();
    }
    @Override
    void add(MyCompentMenu compentMenu) {
    list.add(compentMenu);
    } @Override
    void print() { System.out.println("我是菜单,我的名字是:"+this.text+","+"id:"+this.id+","+"pid:"+this.pId);
    Iterator<MyCompentMenu> iterator =list.iterator();
    while(iterator.hasNext())
    {
    MyCompentMenu menu = iterator.next();
    menu.print();
    }
    } @Override
    void remove(MyCompentMenu compentMenu) {

    }

    }运行结果:
    我是菜单,我的名字是:首页,id:1,pid:null
    我是菜单,我的名字是:用户管理,id:2,pid:1
    叶子节点:内容是:用户列表,id:5,pid:2
    叶子节点:内容是:添加用户,id:6,pid:2
    叶子节点:内容是:修改用户,id:7,pid:2
    我是菜单,我的名字是:资源管理,id:3,pid:1
    叶子节点:内容是:资源列表,id:8,pid:3
    叶子节点:内容是:增加资源,id:9,pid:3
    我是菜单,我的名字是:权限管理,id:4,pid:1
    叶子节点:内容是:权限列表,id:10,pid:4
    叶子节点:内容是:增加权限,id:11,pid:4
    叶子节点:内容是:删除权限,id:12,pid:4
      

  3.   

    还好我没找程序员的工作,面试都是tree,坑爹啊