如何实现三个集合的笛卡尔积?附相关Java代码片段
实现三个列表的笛卡尔积(Java Stream方式)
我来帮你补全这段生成三个列表笛卡尔积的代码,顺便把逻辑讲清楚:
首先是完整的实现代码:
XList<T> combine() { XList<T> returnList = new XList<>(); List<T> list = new ArrayList<>(this.coll); List<T> a = (List<T>) list.get(0); List<T> b = (List<T>) list.get(1); List<T> c = (List<T>) list.get(2); // 生成三个列表的笛卡尔积 List<XList<T>> cartesianProduct = a.stream() .flatMap(ai -> b.stream() .flatMap(bi -> c.stream() .map(ci -> new XList<>(Arrays.asList(ai, bi, ci))))) .collect(Collectors.toList()); // 将结果批量添加到返回列表中(假设XList支持addAll方法) returnList.addAll(cartesianProduct); return returnList; }
代码逻辑说明:
- 核心是用**嵌套的Stream操作(flatMap+map)**实现笛卡尔积:
- 第一层遍历列表
a的每个元素ai - 第二层通过
flatMap遍历列表b的每个元素bi,把ai和bi的组合传递到下一层 - 第三层遍历列表
c的每个元素ci,将三个元素打包成你需要的XList对象
- 第一层遍历列表
- 最后用
Collectors.toList()收集所有组合结果,再批量添加到returnList中
注意:这段代码默认this.coll的前三个元素都是List<T>类型,且XList可以通过Arrays.asList(ai, bi, ci)来初始化。如果XList有更直接的构造方式,也可以替换掉new XList<>(Arrays.asList(...))这部分。
内容的提问来源于stack exchange,提问作者Grzegorz Konar
相关产品推荐
相关产品推荐

