求java List集合依赖项分组排序

红宝石 发布于 2014/05/29 16:23
阅读 1K+
收藏 0
问题:
       我有一组List数据,各项存在依赖,现我想分层次将集合的数据排序。
数据示例:
       public static void main(String[] args) {
List<Map<String,String>> lst = new ArrayList<Map<String,String>>();
Map<String,String> map1 = new HashMap<String, String>();
map1.put("item", "1000");
map1.put("dependItem", "");


Map<String,String> map2 = new HashMap<String, String>();
map2.put("item", "1001");
map2.put("dependItem", "");


Map<String,String> map3 = new HashMap<String, String>();
map3.put("item", "1002");
map3.put("dependItem", "1000");


Map<String,String> map4 = new HashMap<String, String>();
map4.put("item", "1004");
map4.put("dependItem", "1000");


Map<String,String> map5 = new HashMap<String, String>();
map5.put("item", "1005");
map5.put("dependItem", "1001");


Map<String,String> map6 = new HashMap<String, String>();
map6.put("item", "1006");
map6.put("dependItem", "1004");


lst.add(map1);
lst.add(map2);
lst.add(map3);
lst.add(map4);
lst.add(map5);
lst.add(map6);


for (int i = 0; i < lst.size(); i++) {
Map<String,String> map = lst.get(i);
System.out.println(map.get("item")+",依赖项:"+map.get("dependItem"));
       }
}


运行结果是:
1000,依赖项:
1001,依赖项:
1002,依赖项:1000
1004,依赖项:1000
1005,依赖项:1001
1006,依赖项:1004


我想得到的结果是:
1000,依赖项:
1001,依赖项:
------------------
1002,依赖项:1000
1004,依赖项:1000
1005,依赖项:1001
-------------------------
1006,依赖项:1004


共3层,最终是一个List<Vector> 集合大小3.


哪位高手能给实现下..感谢

加载中
0
安卓小菜鸟
安卓小菜鸟
用if根据 dependItem判断呗,如果为null就为第一层,然后把这些数据装入一个list,然后在用list循环判断,当中的值如果与其 dependItem相同在装入一个list,依次类推。。。。
0
红宝石
红宝石
这次层次不明呀. @安卓小菜鸟
0
fneg
fneg

一看就是树结构,为什么用List存储?

0
红宝石
红宝石
需求是这样。主要是要层次分开
0
len
len

我想它能帮上你,看你的模型应该是将平级的对象转换成树型对象。我这个项目中有树是以pid来维护的,但后台是用extjs写的,有时为了extjs的树的展现,需要将list转换成树的数据结构。下面这个类就是做这个处理的。它将任意一个带上下级关系的List<Map>集合转换成最后的树型结果。


package com.lenxeon.extjs.core.utils;

import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.StringUtils;

import java.util.*;


public class Convert {

    public static Collection<Map> List2Tree(Collection<Map> list, String pidKey, String childrensKey) {
        return conver(list, pidKey, childrensKey);
    }

    private static Collection<Map> conver(Collection<Map> list, String pidKey, String childrensKey) {
        Collection<Map> root = new ArrayList<Map>();
        for (Map menu : list) {
            if (MapUtils.getIntValue(menu, pidKey, -1) == 0) {
                root.add(menu);
            }
        }
        list.removeAll(root);
        mapping(list, root, pidKey, childrensKey);
        return root;
    }

    private static void mapping(Collection<Map> source, Collection<Map> list, String pidKey, String childrensKey) {
        for (Map menu : list) {
            Set<Map> root = new LinkedHashSet<Map>();
            for (Map s : source) {
                if (MapUtils.getIntValue(s, pidKey, -1) == MapUtils.getIntValue(menu, "id", -2)) {
                    root.add(s);
                }
            }
            menu.put(childrensKey, root);
            if (root.size() > 0) {
                menu.put("leaf", false);
            } else {
                menu.put("leaf", true);
            }
            source.removeAll(root);
            mapping(source, (Collection) MapUtils.getObject(menu, childrensKey), pidKey, childrensKey);
        }
    }

    public static List<Map> copyKey(List<Map> list, String[] form, String[] to) {
        if (list == null) {
            list = new ArrayList<Map>();
        }
        if (form == null || to == null || form.length != to.length) {
            return list;
        }
        for (Map m : list) {
            for (int i = 0; i < form.length; i++) {
                String f = form[i];
                String t = to[i];
                if (StringUtils.isNotBlank(f) && StringUtils.isNotBlank(t)) {
                    m.put(t, MapUtils.getObject(m, f));
                }
            }
        }
        return list;
    }
}



返回顶部
顶部