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

如何生成两个数组的组合?

戎元忠
2023-03-14

给定两个数组,其中数组1包含变量,数组2包含变量的值,我希望得到这两个数组的所有可能组合,例如:

String[] arr = {"E", "A", "C"};
String[] val = {"true", "false"};

数组arr可以容纳尽可能多的变量,也可以容纳val

所需输出:

E true A true C true
E true A true C false
E true A false C true
E true A false C false

E false A true C true
E false A true C false
E false A false C true
E false A false C false

我尝试了一种递归方法:

import java.util.*;

class Main {
    public static void main(String[] args) {
        String[] arr = {"E", "A", "C"};
        String[] val = {"true", "false"};
        printAll(arr, val, 0);
    }

    public static void printAll(String[] x, String[] y, int index) {
        if (x.length == 0) {
            return;
        }
        for (String d : x) {
            for (String val : y) {
                System.out.print(d + " " + val + " ");
                String[] arr2 = Arrays.copyOfRange(x, index + 1, x.length);
                printAll(arr2, y, index);
            }
        }
        System.out.println();
    }
}
E true A true C true C false 
A false C true C false 
C true C true C false 
C false C true C false 

E false A true C true C false 
A false C true C false 
C true C true C false 
C false C true C false 

A true A true C true C false 
A false C true C false 
C true C true C false 
C false C true C false 

A false A true C true C false 
A false C true C false 
C true C true C false 
C false C true C false 

C true A true C true C false 
A false C true C false 
C true C true C false 
C false C true C false 

C false A true C true C false 
A false C true C false 
C true C true C false 
C false C true C false 

我希望能够将每一行正确的内容保存为arraylist中的一个元素,但首先我想知道如何正确打印每一行。

编辑:第二个数组不是常量,它在每个变量之间不同:

String[] arr = {"E", "A", "C"};
String[] valE = {"true", "false"};
String[] valA = {"true", "false"};
String[] valB = {"set", "noset", "maybe"};

显然,这在递归中行不通,因为我需要将每个数组与变量数组一起发送,我通过创建一个variables对象来实现这一点,该对象包含它的特定值,因此循环是:

for (String d : x) {
    for (String val : d.getValues()) {...}
}

这与主要问题无关,我只是将问题简化为一个简单的情况,即每个变量有两个可能的值。

共有1个答案

贺劲
2023-03-14

您可以使用streams迭代生成两个数组的所有可能组合,如下所示:

String[] arr = {"E", "A", "C"};
String[] val = {"true", "false"};
// an array of possible combinations
String[] comb = Arrays.stream(arr)
        .map(e -> Arrays.stream(val)
                // append each substring
                // with possible combinations
                .map(v -> e + " " + v + " ")
                // return Stream<String[]>
                .toArray(String[]::new))
        // reduce stream of arrays to a single array
        // by sequentially multiplying array pairs
        .reduce((arr1, arr2) -> Arrays.stream(arr1)
                .flatMap(str1 -> Arrays.stream(arr2)
                        .map(str2 -> str1 + str2))
                .toArray(String[]::new))
        .orElse(null);
// output
Arrays.stream(comb).forEach(System.out::println);
E true A true C true 
E true A true C false 
E true A false C true 
E true A false C false 
E false A true C true 
E false A true C false 
E false A false C true 
E false A false C false 

另请参见:通过替换隐藏的“#”数字符号生成所有可能的字符串组合

 类似资料:
  • 有两个不同的字符串数组。 我想把这两个数组做成一个4*2矩阵。 我怎么做这个矩阵?

  • 问题内容: 我正在尝试将javascript中的2个数组合并为一个。 这是一个简单的示例,我希望能够将它们组合起来,以便当读取第二行时,数组中的第4个元素将返回“ d” 我该怎么办? 问题答案:

  • 这里有两个xsd定义,它们几乎90%相似。下面是第一个xsd的框架: 第二个xsd是: 现在,这两个XSD在两个不同的包中生成两组类。我正在使用JAXB来解组收到的XML。XML是从这两个XSD生成的。 在创建JAXB上下文时,它给我带来了错误,因为我相信大多数类都会导致冲突。 下面是错误跟踪: 如果有人能给我提出任何解决方案,那就太好了。 谢谢

  • 问题内容: 有没有一种快速的方法来将一个数组的值组合为另一个数组的键? 输入: 预期产量: 我该怎么办? 问题答案: 会完全按照您的意愿做。 引用手册: 通过将keys数组中的值用作键,并将values数组中的值用作对应值来创建数组。 对于您的情况,您必须执行以下操作: 当然,您也可以使用各种循环组合来做到这一点,这可能是最简单的解决方案。

  • 我有一个初始数据帧 。我从中提取两个数据帧,如下所示: 我想将< code>A和< code>B组合成一个数据帧。数据的顺序并不重要。但是,当我们对来自< code>D的< code>A和< code>B进行采样时,它们会保留来自< code>D的索引。

  • 问题内容: 如果我有两个数组,例如 我想以以下模式[one [0],two [0],one [1],two [1]等合并/交织数组。 什么是实现合并功能的好方法? 问题答案: 如果两个数组的 长度相同, 那么这可能是一种解决方案: 此处枚举并行的数组,并返回一对对(2元素元组)的序列,每个数组中都有一个元素。从每对创建一个2元素数组,并将结果连接起来。 如果数组的 长度 可以 不同, 则可以将较长