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

地图值的笛卡尔乘积[重复]

邴俊达
2023-03-14

我有如下地图:

{"A" : ["A1", "A2", "A3"], "B" : ["B1", "B2", "B3"]}

我想得到如下数据

A1, B1
A1, B2
A1, B3
A2, B1
A2, B2
...

我尝试了如下:

for (String aKey : map.get("A"))
    for (String bKey : map.get("B"))
        // work with aKey + bKey

但这不是我想要的代码,因为地图数据是动态的和不可预知的。

所以我应该像下面这样得到地图数据,但不能像我想要的那样:

for (String key : map.keySet())
    for (String values : map.get(key))
        // unable to make data I want

共有2个答案

范侯林
2023-03-14

如果您有一个列表映射,您可以使用映射和减少方法获得其值的笛卡尔乘积。此代码可用于任意数量的列表。

在线试试吧!

// a map of lists
Map<String, List<String>> map = new TreeMap<>();
map.put("A", Arrays.asList("A1", "A2"));
map.put("B", Arrays.asList("B1", "B2"));
map.put("C", Arrays.asList("C1", "C2"));

// cartesian product of the map values
List<List<String>> cp = map.values().stream()
        // represent each element of a list as a singleton list
        .map(list -> list.stream().map(Arrays::asList)
                // Stream<List<List<String>>>
                .collect(Collectors.toList()))
        // summation of pairs of list into a single list
        .reduce((list1, list2) -> list1.stream()
                // combinations of inner lists
                .flatMap(inner1 -> list2.stream()
                        // concatenate into a single list
                        .map(inner2 -> Stream.of(inner1, inner2)
                                .flatMap(List::stream)
                                .collect(Collectors.toList())))
                // list of combinations
                .collect(Collectors.toList()))
        // otherwise an empty list
        .orElse(Collections.emptyList());

// output
map.forEach((k, v) -> System.out.println(k + ": " + v));
cp.forEach(System.out::println);

输出:

A: [A1, A2]
B: [B1, B2]
C: [C1, C2]
[A1, B1, C1]
[A1, B1, C2]
[A1, B2, C1]
[A1, B2, C2]
[A2, B1, C1]
[A2, B1, C2]
[A2, B2, C1]
[A2, B2, C2]

另请参阅:如何在Java中的任意数字组上创建笛卡尔乘积?

鲁靖
2023-03-14

您已经正确地理解了,不能使用一组静态嵌套循环创建任意数据的笛卡尔积。您需要的是一组嵌套循环的动态集合。我想您在最后一段代码中尝试过这一点。您似乎也明白,您需要的嵌套循环数量与数据中的集合数量相同。问题仍然是:如何编程动态数量的嵌套循环。

基本上有两种方法来执行动态数量的嵌套循环:递归和迭代。两者都获得相同的结果,性能(在时间和内存方面)应该相似。如果实现得好,那就是。

这里有两个类似的问题,一个明确要求迭代解决方案:

  • 如何在Java中创建任意数字组上的笛卡尔积

试着理解两者。你的大脑可能更喜欢其中一个,但至少了解两者是值得的。

递归方法还有一个额外的问题,因为递归可能更难理解:模拟嵌套循环

 类似资料:
  • 我正在尝试对一个后端服务器进行负载测试,并将一些配置解析到一个标签对象中。我正在尝试生成< 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。

  • 的结果将是二维数组: 我试图做的是使用流在Java中编写这个笛卡尔乘积函数。 到目前为止,我有以下Java版本: 我对问题的猜测是: 我需要在某个地方使用收集器(可能在之后) 标识的数据类型错误

  • 问题内容: 我有两个pandas数据框: 获得其笛卡尔积的最佳实践是什么(当然不用像我这样明确地编写它)? 问题答案: 如果每行都有一个重复的键,则可以使用merge生成笛卡尔乘积(就像在SQL中一样)。 输出:

  • 问题内容: 在Tensorflow中有什么简单的方法可以像itertools.product一样做笛卡尔积吗?我想获得两个张量(和)的元素组合,在Python中可以通过itertools作为。我正在Tensorflow中寻找替代方案。 问题答案: 我将在此假定和均为一维张量。 为了得到两者的笛卡尔积,我会用的组合和: 您使用LEN(一) LEN(B) 2张量,其中的元件的每个组合结束并且在最后一维

  • 问题内容: 我对SQL还是很陌生,并且正在为查询而苦苦挣扎(使用Access,FWIW)。我已经搜索并搜索了StackOverflow,但没有看到这种确切的情况。(这也可能是因为我不知道正确的搜索词。) 我有两个非常简单的表,其中包含相似的数据。 我想要的是在两个表以及该人所在的每个表的网络中找到匹配的每个人/州组合: 此人在每个表中可能位于多个网络中。我想查看此人所属的每个网络(从两个表中)。