Skip to content

有点丢人,层级数据处理成你框架的样子,搞了几个小时失败,只有求助大佬 #1

Open

Description

@GuoZhaoHui628

大佬你好,你的框架挺适合我的,但是我要把后台返回给的数据处理成你demo中的样子,一直不成功

[
    {
        "ends": 1,
        "parentId": 190,
        "powerId": 145,
        "powerName": "江国庆"
    },
    {
        "ends": 1,
        "parentId": 1,
        "powerId": 190,
        "powerName": "界港分布式"
    },
    {
        "ends": 1,
        "parentId": 190,
        "powerId": 197,
        "powerName": "阳光伟1"
    }
]

差不多是这样子的,返回集合中的对象长度是不固定的,如果长度为1,集合中就一个对象,那这个对象的parentId一定是1。如果长度大于1,那集合中所有的对象一定有且只有一个parentId对象为1,相当于就只有一个最大的父级,没有和它平级的。
比如这里 集合中三个对象,其中第二个对象的parentId=1,那么最大的父级就是它,然后它的powerid是其他子级的parentId,就通过这样关联起来。
所以现在我要把数据处理成你demo中的,我是这样做的。

public class PowerModel {

    //通过注解的方式,进行model转换
    @NodeId                 //必填字段
    public String id;
    @NodeName               //必填字段
    public String name;

    @NodePid                //必填字段
    public String parentId;

    @NodeChild
    public List<PowerModel> child;  //非叶子节点必填字段
..............
}

这是model,然后首先对接受到的后台数据集合判断下长度,如果长度为1,那就简单了

 if(data.length()==1){  //因为我是在新建demo中尝试,所以这里数据是一个 json文件
                JSONObject jsonObject = data.getJSONObject(0);
                PowerModel model = new PowerModel();
                model.id = jsonObject.getInt("powerId") + "";
                model.parentId = jsonObject.getInt("parentId") + "";
                model.name = jsonObject.getString("powerName");
                model.child = null;
                result.add(model);
                return  result;
            }

这里直接赋值,然后将child设置为null,没有子节点,然后如果数据长度大于1,把所有的parentId添加到一个集合中,然后去重,看下去重后还剩下多少个数据,这里parentId集合中有几个数据就是有几级

else if(data.length()>1){
                for (int i = 0; i < data.length(); i++) {
                    JSONObject jsonObject = data.getJSONObject(i);
                    
                    //将所有的parentId添加到一个集合中
                    int parentId = jsonObject.getInt("parentId");  
                    parentIds.add(parentId);
                    
                    //将json数据全部赋值并且添加到新model的集合中
                    PowerModel model = new PowerModel();
                    model.id = jsonObject.getInt("powerId") + "";
                    model.parentId = jsonObject.getInt("parentId") + "";
                    model.name = jsonObject.getString("powerName");
                    model.child = null;    //假设全部是子节点
                    result.add(model);
                }

                //去重
                removeDuplicate(parentIds);

                Log.d(TAG, "parentIds-->" + parentIds.toString());

有点尴尬了,接下来我所有的思路都有问题,得不出正确的结果,所以请求大佬帮帮忙,帮我瞧一瞧.....

Activity

  1. GuoZhaoHui628 commented on Nov 11, 2017

    @GuoZhaoHui628
    Author

    错了 去重后的parentId集合的长度不能代表层级

  2. czhzero commented on Nov 13, 2017

    @czhzero
    Owner
    public class ServerNode {
        public int parentId;
        public int id;
    }
    
    public class LocalNode {
        public int parentId;
        public int id;
        public List<LocalNode> childs;
    }
    
    
    
    HashMap<Integer, List<LocalNode>> map = new HashMap<>();
    
    private void putValue(int key, ServerNode serverNode) {
        LocalNode localNode = new LocalNode();
        localNode.id = serverNode.id;
        localNode.parentId = serverNode.parentId;
    
        if (map.containsKey(key)) {
    
            map.get(key).add(localNode);
        } else {
            List<LocalNode> list = new ArrayList<>();
            list.add(localNode);
            map.put(key,list);
        }
    }
    
    
    private void generateList(List<LocalNode> list, int parentId) {
    
        list = map.get(parentId);
    
        if (list != null) {
            map.remove(parentId);
        }
    
        if (map.size() == 0) {
            return;
        } else {
    
            for (LocalNode node : list) {
                generateList(node.childs, node.id);
            }
        }
    
    }
    
    public void test() {
    
    
    
        List<ServerNode> serverList = null;
        List<LocalNode> localList = null;
    
    
        for(ServerNode node:serverList) {
            //生成map
            putValue(node.parentId,node);
        }
        
        generateList(localList,1);
        
    
    }
    

    先使用hashmap缓存一下,再递归生成list

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions