对List的数据进行分组

对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分组把一个List<User>分成多个List<User>
        Map<Integer,List<User>> map=new HashMap<Integer,List<User>>();
        //遍历传进来的list
        for (User user : list) {
            //如果map的某个key值已经存在同样的userId,则把这个user添加到这个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));
    }

在这里插入图片描述

利用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));
    }

在这里插入图片描述
``

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值