java 实现 list拆分 按照大小拆分 按照个数拆分

package com.micro.order.util;

import com.google.common.collect.Lists;

import java.util.ArrayList;
import java.util.List;

/**
 * 大list拆分为多个小list处理
 *
 * @author zbo
 * @param <T>
 */
public class  ListSplitUtil<T extends Object> {
    /**
     * @param list 要拆分的list
     * @param size 每次拆分的大小
     * @param <T>
     * @return
     */
    public static <T> List<List<T>> splitSize(List<T> list, int size) {
        if (list == null || list.size() == 0) {
            return null;
        }
        // 获得数据总量
        int count = list.size();
        // 计算出要分成几个批次
        int pageCount = (count / size) + (count % size == 0 ? 0 : 1);
        List<List<T>> temp = new ArrayList<>(pageCount);
        for (int i = 0, from = 0, to = 0; i < pageCount; i++) {
            from = i * size;
            to = from + size;
            // 如果超过总数量,则取到最后一个数的位置
            to = to > count ? count : to;
            // 对list 进行拆分
            List<T> list1 = list.subList(from, to);
            // 将拆分后的list放入大List返回
            temp.add(list1);
            // 也可以改造本方法,直接在此处做操作
        }
        return temp;
    }


    /**
     * @param list 要拆分的list
     * @param sum  要拆分为多少个List
     * @param <T>
     * @return
     */
    public static <T> List<List<T>> splitNum(List<T> list, int sum) {
        if (list == null || list.size() == 0) {
            return null;
        }
        if (list.size() < sum) {
            return null;
        }
        // 获得数据总量
        int count = list.size();
        // 计算出每个批次要分多少
        int pageCount = (count / sum);
        //计算出能不能平均分配 如果不能 最后一个list有几个元素
        int countTemp = count % sum;
        int lastSize = pageCount;
        if (countTemp != 0) {
            lastSize = pageCount + countTemp;
        }

        List<List<T>> temp = new ArrayList<>(pageCount);

        for (int i = 0, from = 0, to = 0; i < sum; i++) {
            from = i * pageCount;
            to = from + pageCount;
            // 如果超过总数量,则取到最后一个数的位置
            List<T> list1 = Lists.newArrayList();
            if (i == (sum - 1)) {
                // 最后一个list
                list1 = list.subList(from, list.size());
            } else {
                // 对list 进行拆分
                list1 = list.subList(from, to);
                // 将拆分后的list放入大List返回
            }
            temp.add(list1);
            // 也可以改造本方法,直接在此处做操作

        }
        return temp;
    }


    // 测试方法
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 52; i++) {
            list.add(i);
        }
        List<List<Integer>> split = splitNum(list, 3);
        for (int i = 0, length = split.size(); i < length; i++) {
            System.out.println(split.get(i));
        }
    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值