找出所有的组合和排列-Java
我是新来的,也是个初学者。我正在做一个个人项目(开发一个个人应用程序)。我有点卡住了,是的,我确实到处找过,但找不到太多。 我的目标是找到所有可能的组合。假设我有一个有限数量的列表,定义如下:找出所有的组合和排列-Java,java,combinations,permutation,Java,Combinations,Permutation,我是新来的,也是个初学者。我正在做一个个人项目(开发一个个人应用程序)。我有点卡住了,是的,我确实到处找过,但找不到太多。 我的目标是找到所有可能的组合。假设我有一个有限数量的列表,定义如下: List<String> AList contains {"a1","a2","a3","a4"} List<String> BList contains {"b1","b2","b3"} List<String> CList contains {"c1","c2"
List<String> AList contains {"a1","a2","a3","a4"}
List<String> BList contains {"b1","b2","b3"}
List<String> CList contains {"c1","c2","c3","c4","c5"}
List<String> DList contains {"d1","d2"}
列表列表包含{“a1”、“a2”、“a3”、“a4”}
列表BList包含{“b1”、“b2”、“b3”}
列表CList包含{“c1”、“c2”、“c3”、“c4”、“c5”}
列表数据列表包含{“d1”,“d2”}
我希望找到以下所有组合:
1) a1和a2的组合与a2和a1相同,依此类推
2) 每个结果集的元素数不固定:每个示例都有可能将所有列表合并为一个。。或者列表中的每个元素都有自己的元素,或者将列表中的两个元素合并到另一个元素中。。等等
我知道它必须是一个递归函数。。但这就是我现在能走多远。。任何帮助都将不胜感激。谢谢我为自己做了类似的事情,但是这会给你a1 a2等的排列,而不是组合,这意味着顺序不重要
public void permutation(String prefix, String str) {
int n = str.length();
if (n==0){}
else {
for (int i = 0; i < n; i++)
permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1, n));
}
}
public void置换(字符串前缀,字符串str){
int n=str.length();
如果(n==0){}
否则{
对于(int i=0;i
使用此逻辑,您必须将列表转换为一个长字符串,然后将字符串发送给此方法。这是我不久前为此目的实现的实用程序类。它使用
int
数组而不是String
列表,但它应该让您了解:
public final class Math {
private Math() {
}
public static int[][] ncks(int n, int k) {
int[] ks = new int[k];
for (int i = 0; i < ks.length; i++) {
ks[i] = i + 1;
}
int[][] ncks = new int[nck(n, k)][];
boolean done = false;
for (int j = 0; !done; j++) {
ncks[j] = Arrays.copyOf(ks, ks.length);
done = getNext(ks, n, k);
}
return ncks;
}
private static int nck(int n, int k) {
int d = 1;
int r = 1;
int m = java.lang.Math.max(k, n - k) + 1;
for (; m <= n; m++, d++) {
r *= m;
r /= d;
}
return r;
}
private static boolean getNext(int[] num, int n, int k) {
int target = k - 1;
num[target]++;
if (num[target] > ((n - (k - target)) + 1)) {
while (num[target] > ((n - (k - target)))) {
target--;
if (target < 0) {
break;
}
}
if (target < 0) {
return true;
}
num[target]++;
for (int i = target + 1; i < num.length; i++) {
num[i] = num[i - 1] + 1;
}
}
return false;
}
}
公共期末数学{
私人数学{
}
公共静态int[]ncks(int n,int k){
int[]ks=新的int[k];
对于(int i=0;i((n-(k-target))){
目标--;
如果(目标<0){
打破
}
}
如果(目标<0){
返回true;
}
num[目标]+;
for(int i=target+1;i
我建议您使用Guava library的Collection2类,而不是编写自己的方法来生成排列和组合。有太多类似于重复元素的情况,如果您编写自己的代码,则需要处理更多的情况。指向番石榴图书馆的链接:收藏2:@SamithaChathuranga在维基百科中查看