list集合分组工具类

单纯记录一下。

最近经常遇到要对集合进行分组的情况,一般有两种情况:1、设置每组人数  2、设置分组数量

1、设置每组人数

分组逻辑代码

  /**
     * @Description: 按每组n分割list,并且返回结果
     * 如:12个,7个一组:[[0, 1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11]]
     * @param: [source 源list, n 每组list的元素个数]
     * @return: java.util.List<java.util.List<T>>
     */
    public static <T> List<List<T>> groupList(List<T> source, int n) {
        if(source == null || source.isEmpty() || n <= 0) {
            return Collections.EMPTY_LIST;
        }
        List<List<T>> all = new ArrayList<>();
        int size = source.size();
        int num = size / n + 1;
        for (int i = 0; i < num; i++) {
            List<T> temp;
            if (i * n + size % n == size) {// 判断是最后一个组时的条件
                temp = source.subList(i * n, size);
            } else {
                temp = source.subList(i * n, (i + 1) * n);
            }
            if(!temp.isEmpty()) {
                all.add(temp);
            }
        }
        return all;
    }

测试

public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 12; i++) {
            list.add(i);
        }
      List<List<Integer>> all = groupList(list, 7);//设置每组个数为7
        System.out.println("一共有:"+all.size()+"组");
        System.out.println(all);
    }

输出

一共有:2组
[[0, 1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11]]

2、设置分组数量

这个是已知分组数量,每组个数待定;但是总个数并不会一直都能平均分配,所以对多出来的数据的处理会有多种可能,这就要按需处理了。

分组代码逻辑

对于多出来的数据,从第一组开始轮巡。

/**
     * @Description: 将一组数据平均分成n组
     * 如:12个,分5组 :[[0, 1, 2], [3, 4, 5], [6, 7], [8, 9], [10, 11]]
     * @param: [source 源list, n 每组list的元素个数]
     * @return: java.util.List<java.util.List<T>>
     */
    public static <T> List<List<T>> groupList1(List<T> source, int n) {
        if(source == null || source.isEmpty() || n <= 0) {
            return Collections.EMPTY_LIST;
        }
        List<List<T>> all = new ArrayList<>();
        int mod = source.size() / n; //平均每组个数
        int remainder = source.size() % n;  //余数:多出来的个数
        int offset = 0;
        for (int i = 0; i < n; i++) {
            List<T> value = null;
            if (remainder > 0) {//当余数不为0时:从第一组开始,每组个数都 平均个数+1 ,直至余数为0
                value = source.subList(i * mod + offset, (i + 1) * mod + offset + 1);
                remainder--;
                offset++;
            } else {//余数为0时:按每组mod截取
                value = source.subList(i * mod + offset, (i + 1) * mod + offset);
            }
            all.add(value);
        }
        return all;
    }

测试

   public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 12; i++) {
            list.add(i);
        }

        List<List<Integer>> all = groupList1(list, 5);//设置共分5组
        System.out.println("一共有:"+all.size()+"组");
        System.out.println(all);

    }

输出

一共有:5组
[[0, 1, 2], [3, 4, 5], [6, 7], [8, 9], [10, 11]]

木了~就先这样吧~拜~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值