日常中需要对一个大的集合进行拆分成多个小集合,其主要思路为:
- 设置需要拆分多少个小集合 A
- 大集合里面有多少条数据 B
- 计算出每个集合里面有多个条数据 C=B/A
- 计算出看是否存在余数 D=B%A
- 采用集合(List.subList())的方法对大集合进行拆分,循环A变进行集合拆分(List.subList((A-1)*C,(A-1)*C+(C-1))
- 如果存在余数D,则需要将剩余的数据放在一个集合中 (List.subList((AC,AC+D)
代码如下:
java
/**
* 集合切分(将一个1002大小的集合,拆分为5个小集合)
* @param list 目标集合
* @param partitionSize 需要拆分集合的个数
* @param <T> 泛型对象
* @return 切分后的总的集合
*/
public static <T> List<List<T>> listPartition(List<T> list, int partitionSize) {
//①如果集合时空的或者初始设置的集合大小小于等于0,返回一个新集合
if (list.isEmpty() || partitionSize <= 0) {
return new ArrayList();
}
//②封装最后返回的结果集的集合
List<List<T>> listResult = new ArrayList<>();
int size = list.size();
//③如果目标集合的大小小于设置集合的大小,将目标集合,全部加载到封装结果集中,返回结束
if (size <= partitionSize) {
listResult.add(list);
return listResult;
}
//④计算出拆分的集合的大小(size =1002, partitionSize= 5 partitionNum =200 partitionRemainder=2)
int partitionNum = size / partitionSize;
//⑤计算出最后一个拆分集合的大小
int partitionRemainder = size % partitionSize;
for (int a = 1; a <= partitionSize; a++) {
//⑥对目标集合进行截取 ((1-1)*200,((1-1)*200)+(200-1))
List<T> ts = list.subList((a - 1) * partitionNum, ((a - 1) * partitionNum) + (partitionNum - 1));
listResult.add(ts);
}
//⑦如果最后一个拆分集合的大小大于0
if (partitionRemainder > 0) {
//⑧对目标集合进行截取 ((200*5,200*5+2)
List<T> ts = list.subList(partitionNum * partitionSize, partitionNum * partitionSize + partitionRemainder);
listResult.add(ts);
}
//⑨返回结果集
return listResult;
}