From 8913aeaf33aa998bdb6461047c6d9c91f4e3e286 Mon Sep 17 00:00:00 2001 From: easepan Date: Wed, 14 Oct 2020 13:16:15 +0800 Subject: [PATCH] fix: optimize split for list --- .../cn/hutool/core/collection/CollUtil.java | 13 +++++++++ .../cn/hutool/core/collection/ListUtil.java | 25 +++++++++++++++++ .../hutool/core/collection/ListUtilTest.java | 27 +++++++++++++++++++ 3 files changed, 65 insertions(+) diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java index 52e1d8151..208667353 100644 --- a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java @@ -1115,6 +1115,19 @@ public class CollUtil { return sub(new ArrayList<>(list), start, end, step); } + /** + * 对集合按照指定长度分段,每一个段为单独的集合,返回这个集合的列表 + * + * @param 集合元素类型 + * @param list 列表 + * @param size 每个段的长度 + * + * @return 分段列表 + */ + public static List> splitList(List list, int size) { + return ListUtil.split(list, size); + } + /** * 对集合按照指定长度分段,每一个段为单独的集合,返回这个集合的列表 * diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java index fef0bfac6..34805119f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java @@ -494,4 +494,29 @@ public class ListUtil { public static List empty() { return Collections.emptyList(); } + + /** + * 对集合按照指定长度分段,每一个段为单独的集合,返回这个集合的列表 + * + * @param 集合元素类型 + * @param list 列表 + * @param size 每个段的长度 + * + * @return 分段列表 + */ + public static List> split(List list, int size) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + + List> result = new ArrayList<>(list.size() / size + 1); + int offset = 0; + for (int toIdx = size; toIdx <= list.size(); offset = toIdx, toIdx += size) { + result.add(list.subList(offset, toIdx)); + } + if (offset < list.size()) { + result.add(list.subList(offset, list.size())); + } + return result; + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/collection/ListUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/collection/ListUtilTest.java index 61aa2855c..4739eeb3f 100644 --- a/hutool-core/src/test/java/cn/hutool/core/collection/ListUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/collection/ListUtilTest.java @@ -1,12 +1,39 @@ package cn.hutool.core.collection; +import cn.hutool.core.date.StopWatch; +import cn.hutool.core.lang.Console; +import cn.hutool.core.util.RandomUtil; import org.junit.Assert; import org.junit.Test; +import java.util.ArrayList; import java.util.List; public class ListUtilTest { + @Test + public void split() { + List list = new ArrayList<>(); + CollUtil.padRight(list, RandomUtil.randomInt(1000_0000, 1_0000_0000), "test"); + + int size = RandomUtil.randomInt(10, 1000); + Console.log("\nlist size: {}", list.size()); + Console.log("partition size: {}\n", size); + StopWatch stopWatch = new StopWatch(); + + stopWatch.start("CollUtil#split"); + List> CollSplitResult = CollUtil.split(list, size); + stopWatch.stop(); + + stopWatch.start("ListUtil#split"); + List> ListSplitResult = ListUtil.split(list, size); + stopWatch.stop(); + + Assert.assertEquals(CollSplitResult, ListSplitResult); + + Console.log(stopWatch.prettyPrint()); + } + @Test public void filterTest(){ List a = ListUtil.toLinkedList("1", "2", "3");