Java 计算置换的最佳方法
我正试图找出最好的方法,为某个场景找到/自动化所有可能的排列 我有一个程序,它接受一组数字[X,Y,Z],每个数字都有一个预定义的不确定性。因此,我想对[X,Y,Z],[X+e,Y,Z][X-e,Y,Z],[X,Y+e,Z]等运行我的程序。现在我已经构建了一个包含所有27种可能性的对象,我正在迭代它,以便为我的程序提供一组新的输入。(我将使用不同的输入集运行程序27次) 随着时间的推移,我需要更新我的程序以接收更多的数字。所以我想知道是否有更好的方法来计算我的基集可能具有的所有可能的置换Java 计算置换的最佳方法,java,permutation,Java,Permutation,我正试图找出最好的方法,为某个场景找到/自动化所有可能的排列 我有一个程序,它接受一组数字[X,Y,Z],每个数字都有一个预定义的不确定性。因此,我想对[X,Y,Z],[X+e,Y,Z][X-e,Y,Z],[X,Y+e,Z]等运行我的程序。现在我已经构建了一个包含所有27种可能性的对象,我正在迭代它,以便为我的程序提供一组新的输入。(我将使用不同的输入集运行程序27次) 随着时间的推移,我需要更新我的程序以接收更多的数字。所以我想知道是否有更好的方法来计算我的基集可能具有的所有可能的置换 我宁愿
我宁愿知道实现这个的方法,而不是使用任何现有的库(如果有的话)。我认为这是一个学习计划。谢谢 您可以使用嵌套循环,而不是手动写下3x3组3个数字。如果有3个循环,一个循环在另一个循环内,每个循环运行3次,则会得到27个输出:
double[] numbers = new double[3];
double[] e = {-1e-6, 0, 1e-6};
for (double eX : e) {
for (double eY : e) {
for (double eZ : e) {
double[] newNumbers = {numbers[0] + eX, numbers[1] + eY, numbers[2] + eZ};
// Run your program using "newNumbers". Just as an example:
System.out.println(Arrays.toString(newNumbers));
}
}
}
至于
随着时间的推移,我需要更新我的程序以接收更多的数字
如果集合的大小将变小且固定,则可以添加更多嵌套循环。如果没有,您将需要更先进的技术。这是我不久前发现的一种排列方法。它在方法中打印它们。它只做一维排列,但你可以根据你的需要调整它
public static void generate(int n, int[] a) {
if (n == 1) {
System.out.println(Arrays.toString(a));
} else {
for (int i = 0; i < n - 1; i++) {
generate(n - 1, a);
if ((n & 1) == 0) {
swap(i, n - 1, a);
} else {
swap(0, n - 1, a);
}
}
generate(n - 1, a);
}
}
public static void swap(int a, int b, int[] array) {
int temp = array[a];
array[a] = array[b];
array[b] = temp;
}
publicstaticvoidgenerate(int n,int[]a){
如果(n==1){
System.out.println(Arrays.toString(a));
}否则{
对于(int i=0;i
我认为最好的方法是实现一个并将其包装成:
公共接口组合扩展流{
集合的公共静态流(集合){
拆分器供应商=
新拆分器供应商(集合);
返回supplier.stream();
}
...
}
它解决了一般用例:
forEach(t->process(t))(X,Y,Z的列表)的组合;
实现Spliterator
很简单,但是很乏味,我已经写过了。关键部件是一个DispatchSpliterator
:
专用迭代器拆分器=null;
private Spliterator Spliterator=Spliterators.emptySpliterator();
...
受保护的抽象迭代器拆分器();
...
@凌驾
公共拆分器trySplit(){
if(拆分器==null){
spliterators=spliterators.iterator(spliterators());
}
返回spliterators.hasNext()?spliterators.next().get():null;
}
@凌驾
public boolean tryAdvance(消费者请阅读您在这里缺乏详细信息和重点。