Java分割集合 Java分割 list java分割集合 java分割list Java 平均分割集合列表

Java分割集合 Java分割 list java分割集合 java分割list Java 平均分割集合列表

需求,生产二维码内容有限制,并且 内容过多,会导致二维码很臃肿 扫描不出来,之前是用 谷歌的 Lists.partition,但是还有一个问题就是,分割好的集合数量不均匀,比如 300个文字,一个集合最多存放200个字,就会出现 一个集合 有200个,一个集合只有100个,这种,我想要的是 两个集合 都是平均数量 只有 150个

纯Java jdk实现

分割方法

public class MyListUitls{
    
    
    /**
     * 按照指定数量分割集合
     *
     * @param list 需要分割的集合
     * @param size 一个集合最多数量
     * @return List<List < T>>
     */
    public static <T> List<List<T>> partition(List<T> list, int size) {
    
    

        // 一个集合最多数量
        BigDecimal singleListCount = new BigDecimal(size);

        // 当前集合总数量
        BigDecimal nowAllCount = new BigDecimal(list.size());

        // 分割集合数量 = 总数量 / 当个集合最多数量, 值始终要五入,例如 当个集合最多100,总数量是120个,那么需要两个集合

        int listCount = nowAllCount.divide(singleListCount, 0, RoundingMode.UP).intValue();

        // 创建 分割集合
        List<List<T>> partitionList = new LinkedList<>();
        for (int i = 0; i < listCount; i++) {
    
    
            partitionList.add(new LinkedList<>());
        }

        // 计算 一个集合平均数量,避免出现 两个集合,一个集合有150个,另外一个集合只有1个的现象

        int avg = list.size() / listCount;

        // 将数据平均放入 分割好的集合中
        for (T s : list) {
    
    
            // 遍历放入分割好的集合
            for (int i = 0; i < listCount; i++) {
    
    
                if (partitionList.get(i).size() < avg) {
    
    
                    partitionList.get(i).add(s);
                    break;
                }
            }
        }
        return partitionList;
    }
 }

调用方法Demo测试

    /**
     * 平均分割集合数量
     */
    @Test
    public void test1() {
    
    
        LinkedList<String> childSnList = new LinkedList<>();
        for (int i = 1, size = 1500; i <= size; i++) {
    
    
            childSnList.add(String.valueOf(i));
        }
        List<List<String>> partitionList = MyListUitls.partition(childSnList, 150);
        System.out.printf("分割后的集合数量:%s\n", partitionList.size());
        partitionList.forEach(item -> {
    
    
            item.forEach(System.out::println);
        });

    }

源码分割Demo测试

    /**
     * 平均分割集合数量
     */
    @Test
    public void Test2() {
    
    
    	// 准备一个 集合源数据,存放170个字符串,一个集合存放150个,那么分割后应该有两个集合
        LinkedList<String> childSnList = new LinkedList<>();
        for (int i = 1, size = 170; i <= size; i++) {
    
    
            childSnList.add(String.valueOf(i));
        }
        // 一个集合最多数量
        BigDecimal singleListCount = new BigDecimal(150);

        // 当前集合总数量
        BigDecimal nowAllCount = new BigDecimal(childSnList.size());

        // 分割集合数量 = 总数量 / 当个集合最多号数量, 值始终要五入,例如 当个集合最多100,总数量是120个,那么需要两个集合

        int listCount = nowAllCount.divide(singleListCount, 0, RoundingMode.UP).intValue();

        // 创建 分割集合
        List<List<String>> partitionList = new LinkedList<>();
        for (int i = 0; i < listCount; i++) {
    
    
            partitionList.add(new LinkedList<>());
        }

        // 计算 一个集合平均数量,避免出现 两个集合,一个集合有150个,另外一个集合只有1个的现象

        int avg = childSnList.size() / listCount;

        // 将字符串平均放入 分割好的集合中
        for (String s : childSnList) {
    
    
            // 遍历放入分割好的集合
            for (int i = 0; i < listCount; i++) {
    
    
                if (partitionList.get(i).size() < avg) {
    
    
                    partitionList.get(i).add(String);
                    break;
                }
            }
        }
        System.out.printf("分割后的集合数量:%s\n", partitionList.size());
        System.out.println("开始输出字符串", 
        for (List<String> strings : partitionList) {
    
    
            for (String string : strings) {
    
    
                System.out.println(string);
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/qq_40739917/article/details/129145846