美文网首页
java 均匀分割数组或集合

java 均匀分割数组或集合

作者: 田才 | 来源:发表于2021-09-15 12:54 被阅读0次

    需求:假设文件夹内有多个小文件需要拆分给多个服务器处理,拆分尽量均匀顺序不能乱。

    入参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);
        }
    

    相关文章

      网友评论

          本文标题:java 均匀分割数组或集合

          本文链接:https://www.haomeiwen.com/subject/tlvkgltx.html