需求:假设文件夹内有多个小文件需要拆分给多个服务器处理,拆分尽量均匀顺序不能乱。
入参list 是需要分割的数组,groups 是需要分割多少份,limits 是函数返回第几份。
思路是,数组长度除groups ,余数中每一个元素均匀分配到组。因为groups一定大于等于余数,组的pageSize加1,一定可全部分担所有余数。
1、 list.length % group == 0 是刚好均分,那么 pageSize = list.length / group
2、(list.length % group)>= groupLimit,说明还有余数没有均分完成,所以 pageSize = (list.length / group) + 1
3、有余数且余数均分完成,skip 要等于之前均分余数的组长度加上无需均分余数的组长度
public static String[] groupFilter(String[] list, String groups, String groupLimits) {
if (list == null || list.length == 0) {
return list;
}
if (!NumberUtils.isParsable(groups) || !NumberUtils.isParsable(groupLimits)) {
return list;
}
int group = Integer.parseInt(groups);
int groupLimit = Integer.parseInt(groupLimits);
if (group <= 1 || groupLimit <= 0 || groupLimit > group) {
return list;
}
int pageSize = list.length / group;
int mod = list.length % group;
int skip = 0;
if(mod == 0){//刚好均分
skip = pageSize * (groupLimit - 1);
}else if (mod >= groupLimit) {//有余数均分余数
pageSize = pageSize + 1;
skip = pageSize * (groupLimit - 1);
} else {//有余数且余数均分完成
skip = ((pageSize + 1) * mod) + (pageSize * (groupLimit - mod - 1));
}
return Arrays.stream(list).sorted().skip(skip).limit(pageSize).toArray(String[]::new);
}
网友评论