当前位置: 首页 > 知识库问答 >
问题:

使用Java流的笛卡尔乘积

齐弘业
2023-03-14
function cartesianProduct(arr) {
    return arr.reduce(function(a,b) {
        return a.map(function(x) {
            return b.map(function(y) {
                return x.concat(y);
            });
        }).reduce(function(a,b) { return a.concat(b); }, []);
    }, [[]]);
}
var data = [[['D']], [['E'],['L','M','N']]];

cartesianproduct(data)的结果将是二维数组:

[['D','E'], ['D','L','M','N']]

我试图做的是使用流在Java中编写这个笛卡尔乘积函数。

到目前为止,我有以下Java版本:

public Collection<Collection<String>> cartesianProduct(Collection<Collection<Collection<String>>> arr) {

    return arr.stream().reduce(new ArrayList<Collection<String>>(), (a, b) -> {
        return a.stream().map(x -> {
            return b.stream().map(y -> {
                return Stream.concat(x.stream(), y.stream());
            });
        }).reduce(new ArrayList<String>(), (c, d) -> {
            return Stream.concat(c, d);
        });
    });
}

我对问题的猜测是:

  • 我需要在某个地方使用收集器(可能在stream.concat之后)
  • 标识的数据类型错误

共有1个答案

任小云
2023-03-14

这是可能的,只要有一点函数编程的魔力。以下是接受集合 > 并生成 > 的方法:

static <T> Stream<Collection<T>> cartesianProduct(Collection<Collection<Collection<T>>> arr)
{
    return arr.stream()
        .<Supplier<Stream<Collection<T>>>> map(c -> c::stream)
        .reduce((s1, s2) -> () -> s1.get().flatMap(
                a -> s2.get().map(b -> Stream.concat(a.stream(), b.stream())
                        .collect(Collectors.toList()))))
        .orElseGet(() -> () -> Stream.<Collection<T>>of(Collections.emptyList()))
        .get();
}

用法示例:

cartesianProduct(
    Arrays.asList(Arrays.asList(Arrays.asList("D")),
        Arrays.asList(Arrays.asList("E"), Arrays.asList("L", "M", "N"))))
            .forEach(System.out::println);

输出:

[D, E]
[D, L, M, N]
 类似资料:
  • 我正在尝试对一个后端服务器进行负载测试,并将一些配置解析到一个标签对象中。我正在尝试生成< code>Label对象的笛卡尔乘积,这将是一个< code>Metric对象。 我有一个 方法添加 我试图以迭代/递归的方式做到这一点,但它变得非常复杂和混乱。我检查了是否有java8替代方案。如果我能够获得

  • 本文向大家介绍map reduce实现笛卡尔乘积?相关面试题,主要包含被问及map reduce实现笛卡尔乘积?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 在Map阶段,将来自矩阵A的元素标识成l条<key,value>的形式,key=(i,k),k=1,2,…,l。value=(j,)。将来自矩阵B的元素标识成l条<key,value>的形式,key=(i,k),k=1,2,…,m。

  • 问题内容: 我想创建一个方法,该方法创建元素流,这些元素流是多个给定流的笛卡尔积(由二元运算符最后汇总为相同类型)。请注意,参数和结果都是流, 而不是 集合。 例如,对于 {A,B} 和 {X,Y}的 两个流,我希望它产生值 {AX,AY,BX,BY}的流 (简单串联用于聚集字符串)。到目前为止,我想出了以下代码: 这是我想要的用例: 预期结果:。 另一个例子: 预期结果:。 但是,如果我运行代码

  • 我有如下地图: 我想得到如下数据: 我尝试了如下: 但这不是我想要的代码,因为地图数据是动态的和不可预知的。 所以我应该像下面这样得到地图数据,但不能像我想要的那样:

  • 例如,对于{A,B}和{X,Y}这两个流,我希望它生成值流{AX,AY,BX,BY}(简单的串联用于聚合字符串)。到目前为止,我已经想出了这段代码: 这是我想要的用例: 预期结果:。 溪流消耗在哪里?按平面地图?很容易修好吗?

  • 问题内容: 我具有以下集合类型: 我想为每个Key从集合中的单个值创建每个的唯一组合。 例如,假设地图如下所示: 我想得到的结果看起来像是一个结果(排序并不重要,它只需要是由所有可能的组合组成的“完整”结果)即可: 这基本上是一个计数问题,但是我想看看使用Java 8流是否可以解决。 问题答案: 您可以使用递归链解决此问题。 首先,当我们需要在映射值之间来回移动时,最好将它们复制到(这不是深度复制