例如,我有一个数组["Sam", "Mary", "John"]
。
我想显示选择 2 out of 3 的组合。
结果应该是:
[Sam, Mary]
[Sam, John]
[Mary, John]
我研究了很多,但仍然不知道该怎么做。
当然,这个例子只包含 3 个人。
事实上,总人数会更大,例如15
这是我发现的:
从 n 返回 k 个元素的所有组合的算法
其中一些只是显示nCr的值,而不是给出组合。
例如,我有一个数组["Sam", "Mary", "John"]
。
我想显示选择 2 out of 3 的组合。
结果应该是:
[Sam, Mary]
[Sam, John]
[Mary, John]
我研究了很多,但仍然不知道该怎么做。
当然,这个例子只包含 3 个人。
事实上,总人数会更大,例如15
这是我发现的:
从 n 返回 k 个元素的所有组合的算法
其中一些只是显示nCr的值,而不是给出组合。
public static int width;
public static void main(String [] args){
String[] array = {"one", "two", "three", "four", "five"};
width = 3;
List<String> list = new ArrayList<String>();
for (int i = 0; i < array.length; i++){
method(array, list, i, 1, "[" + array[i]);
}
System.out.println(list);
}
public static void method(String[] array, List<String> list, int i, int depth, String string){
if (depth == width){
list.add(string + "]");
return;
}
for (int j = i+1; j < array.length; j++){
method(array, list, j, depth+1, string + ", " + array[j]);
}
}
打印给定字符串数组(命名array
)的组合(nCr)的简单递归函数:
String[] array = {"Sam", "Mary", "John"};
public void function(int counter, String comb_Str, int r) {
if (r == 0) {
System.out.println(comb_Str);
} else {
for (; counter < array.length; ++counter) {
function(counter + 1, comb_Str + " " + array[counter], r - 1);
}
}
}
调用使用function(0, "", #r value#)
r 值应 <= n 值(数组长度)
这可能并不完美,但它应该让你走上正轨。创建一个函数来获取每个元素的组合。然后你只需要遍历每个元素并在每个元素上调用你的函数。
int num = 2; //Number of elements per combination
for(int i=0; i <= (array.length - num); i++) {
String comb = "[" + array[i];
comb += getComb(i,num);
comb += "]";
println(comb);
}
String getComb(int i, int num) {
int counter = 1;
String s = "";
while(counter < num) {
s += ", " + array[i+counter];
counter++;
}
return s;
}
这是一些伪代码,可帮助您开始使用递归解决方案。列表比字符串数组更容易使用,因为您可以轻松更改它们的大小。此外,一旦你得到你的组合,你可以迭代它们以显示它们,但是你想要的。然而,尽管这是一个值得考虑的好问题,但组合的数量很快就会失控,因此如果您处理的结果不止少数,那么将它们全部显示给用户将成为一个坏主意......
/**
* @param list The list to create all combos for
* @param comboSize The size of the combo lists to build (e.g. 2 for 2 items combos)
* @param startingIndex The starting index to consider (used mainly for recursion). Set to 0 to consider all items.
*/
getAllCombos(list, comboSize, startingIndex){
allCombos;
itemsToConsider = list.length - startingIndex;
if(itemsToConsider >= comboSize){
allCombos = getAllCombos(list, comboSize, startingIndex + 1);
entry = list[startingIndex];
if(comboSize == 1){
singleList;
singleList.add(entry);
allCombos.add(singleList);
} else {
subListCombos = getAllCombos(list, comboSize - 1, i+1);
for(int i = 0; i < subListCombos.length; i++){
subListCombo = subListCombos[i];
subListCombo.add(entry);
allCombos.add(subListCombo);
}
}
}
return allCombos;
}