如何生成两个数组的组合? [英] How do I generate combinations of two arrays?
问题描述
给出两个数组,其中一个数组包含变量,而第二个数组包含变量的值,我想获得这两个数组的所有可能组合,例如:
Given two arrays, where array one has variables and array two contains the variable's values, I want to get all possible combinations of those two arrays, for example:
String[] arr = {"E", "A", "C"};
String[] val = {"true", "false"};
数组 arr
可以容纳尽可能多的变量,也可以容纳 val
.
Array arr
can hold as many variables as possible, and val
too.
所需的输出:
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
我尝试了一种递归方法:
I tried a recursion approach:
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
中的元素,但首先我想弄清楚如何正确打印每行.
I want to be able to save each correct line as an element in an ArrayList
but first I want to figure out how to print each line correctly.
第二个数组不是常数,每个变量之间是不同的:
The second array is not constant, it differs between each variable:
String[] arr = {"E", "A", "C"};
String[] valE = {"true", "false"};
String[] valA = {"true", "false"};
String[] valB = {"set", "noset", "maybe"};
显然,这无法递归工作,因为我需要沿着变量数组发送每个数组,我通过创建一个包含其特定值的 Variables
对象来实现此目的,因此循环将是:/p>
Obviously this wont work in recursion as I need to send each array along side the variables array, I achieve this by creating a Variables
object which contains its specific values, so the loop would be:
for (String d : x) {
for (String val : d.getValues()) {...}
}
这与主要问题无关,我只是将问题简化为一个简单的情况,其中每个变量都有两个可能的值.
This is not relevant to the main question, I simply reduced the question to a simple case where each variable has two possible values.
推荐答案
您可以使用 streams
迭代地生成两个数组的所有可能组合,如下所示:
You can iteratively generate all possible combinations of two arrays using streams
as follows:
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
另请参见:通过替换隐藏的#"数字符号来生成所有可能的字符串组合
这篇关于如何生成两个数组的组合?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!