单纯记录一下。
最近经常遇到要对集合进行分组的情况,一般有两种情况: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]]
木了~就先这样吧~拜~