欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

对List的数据进行分组

程序员文章站 2022-05-21 16:17:18
...

对List的数据进行分组

一:我们平常在工作的时候可能会遇到要对List里面的数据进行分组在jdk1.8有方法帮我们解决,而在1.8之前我们要实现这样的功能就需要自己手动实现分组

我们先定义一个User类

public class User {
    private int id;
    private String contractName;

    public User(int id, String contractName) {
        this.id = id;
        this.contractName = contractName;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getContractName() {
        return contractName;
    }

    public void setContractName(String contractName) {
        this.contractName = contractName;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", contractName='" + contractName + '\'' +
                '}';
    }
}

我们先实现自定义List数据分组

public static List<User> listDataSort(List<User> list){
        List<User> transformList=new ArrayList<User>();
        //创建一个map,来List<User>把一个分成多个List<User>
        Map<Integer,List<User>> map=new HashMap<Integer,List<User>>();
        //遍历传进来的list
        for (User user : list) {
            //如果map的某个key值已经存在同样的userId,则添加这个key所在的List<User>
            if(map.containsKey(user.getId())){
                map.get(user.getId()).add(user);
            }
            else{
                //如果没有相同的id,就新创建一个List
                List<User> newList=new ArrayList<User>();
                //添加数据
                newList.add(user);
                map.put(user.getId(),newList);
            }
        }
        /*
        把Map转换成List<List<User>>,为什么会变成List<List<User>>,原因在于
        map是以多个userId为键值,存储多个List<User>,map.values转换成list就会变成
        List<List<User>>
         */
        List<List<User>> lists=new ArrayList<List<User>>(map.values());
        //遍历lists
        for (List<User> users : lists) {
            for (User user : users) {
                //现在添加进来的User都是分好组的
                transformList.add(user);
            }
        }
        return transformList;
    }

进行测试

public static void main(String[] args) {
        List<User> list=new ArrayList<User>();
        list.add(new User(1,"一号合同"));
        list.add(new User(2,"一号合同"));
        list.add(new User(1,"二号合同"));
        list.add(new User(3,"一号合同"));
        list.add(new User(3,"二号合同"));
        list.add(new User(2,"二号合同"));
        System.out.println("分组前:"+list);
        System.out.println("分组后:"+listDataSort(list));
    }

对List的数据进行分组

利用jdk1.8的新方法进行分组

public static List<User> groupList(List<User> users) {
        List<User> transformList=new ArrayList<User>();
        //创建一个List<List<User>>来接收工具排序后遍历出来的多个List<User>
        List<List<User>> lists=new ArrayList<List<User>>();
        //jdk1.8新增加的List.stream(),利用流来操作
        /*
        * stream()是把List转换成流
        * collect()是把流转换回集合
        * Collectors.groupingBy()对collect进行分组
        * User::getId,根据User对象的getId进行分组
        * Collectors.toList() 把每一组转换成List集合
        * forEach() 进行遍历,内部自定义方法 () -> {} 这是lambada表达式,遍历出每个List<User>
        * 把每个List<User>放进lists
        * forEach里面的id 可以写成任何字符串,比如s aa,bb等,
        * 因为我们是根据id分组的,所以写成id,usersById也可以写成任何值,
        * 比如s aa,bb等,lambada是自动填充数据的
        * */
        users.stream().collect(Collectors.groupingBy(User::getId,Collectors.toList()))
                .forEach((id,usersById) -> {
                    lists.add(usersById);
                });
        if(lists!=null){
            for (List<User> list : lists) {
                for (User user : list) {
                    transformList.add(user);
                }
            }
        }
        return transformList;
    }

进行测试

public static void main(String[] args) {
        List<User> list=new ArrayList<User>();
        list.add(new User(1,"一号合同"));
        list.add(new User(2,"一号合同"));
        list.add(new User(1,"二号合同"));
        list.add(new User(3,"一号合同"));
        list.add(new User(3,"二号合同"));
        list.add(new User(2,"二号合同"));
        System.out.println("分组前:"+list);
        System.out.println("分组后:"+groupList(list));
    }

对List的数据进行分组
``

相关标签: java