From ede848ed0767672fb6daea9bb0c73a195396655d Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 29 Sep 2024 16:19:07 +0800 Subject: [PATCH] add CollStreamUtil --- .../core/collection/CollStreamUtil.java | 22 +++++++++++++++++++ .../core/collection/CollStreamUtilTest.java | 21 +++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollStreamUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollStreamUtil.java index 188d83225..06978d628 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollStreamUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollStreamUtil.java @@ -29,6 +29,7 @@ import java.util.function.BiFunction; import java.util.function.Function; import java.util.stream.Collector; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * 集合的stream操作封装 @@ -396,4 +397,25 @@ public class CollStreamUtil { } return map; } + + /** + * 笛卡尔积
+ * 参考:https://www.baeldung-cn.com/java-cartesian-product-sets + * + * @param sets 集合列表 + * @param index 索引 + * @return 笛卡尔积 + */ + public static Stream> cartesianProduct(final List> sets, final int index) { + if (index == sets.size()) { + return Stream.of(ListUtil.zero()); + } + final List currentSet = sets.get(index); + return currentSet.stream().flatMap(element -> cartesianProduct(sets, index + 1) + .map(list -> { + final List newList = new ArrayList<>(list); + newList.add(0, element); + return newList; + })); + } } diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/collection/CollStreamUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/collection/CollStreamUtilTest.java index c4b8c8f5e..2554d318e 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/collection/CollStreamUtilTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/collection/CollStreamUtilTest.java @@ -16,10 +16,10 @@ package org.dromara.hutool.core.collection; -import org.dromara.hutool.core.map.MapUtil; import lombok.AllArgsConstructor; import lombok.Data; import lombok.ToString; +import org.dromara.hutool.core.map.MapUtil; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -320,6 +320,25 @@ public class CollStreamUtilTest { } } + @Test + void cartesianProductTest() { + final List> sets = new ArrayList<>(); + sets.add(ListUtil.of(10, 20)); + sets.add(ListUtil.of("John", "Jack")); + sets.add(ListUtil.of('I', 'J')); + + final List> collect = CollStreamUtil.cartesianProduct(sets, 0).collect(Collectors.toList()); + Assertions.assertEquals(8, collect.size()); + Assertions.assertEquals("[10, John, I]", collect.get(0).toString()); + Assertions.assertEquals("[10, John, J]", collect.get(1).toString()); + Assertions.assertEquals("[10, Jack, I]", collect.get(2).toString()); + Assertions.assertEquals("[10, Jack, J]", collect.get(3).toString()); + Assertions.assertEquals("[20, John, I]", collect.get(4).toString()); + Assertions.assertEquals("[20, John, J]", collect.get(5).toString()); + Assertions.assertEquals("[20, Jack, I]", collect.get(6).toString()); + Assertions.assertEquals("[20, Jack, J]", collect.get(7).toString()); + } + /** * 班级类 */