我想从输入数组返回所有可能组合的完整数组。我想生成n个选择k组合,其中k = 1到n。到目前为止,我一直没有成功。
def reset(self):#reset all the values for the game
self.confirm.grid(row=2, column=1)
inputtext=""
gamelabel=self.gamelabel.cget("text")
self.gamelabel.config(text="PLEASE TYPE CONFIRM TO START THIS NEW GAME OR CANCEL TO RESUME YOUR CURRENT ONE")
while inputtext=="":
inputtext=self.confirm.get()
inputtext.lower()
if inputtext=="confirm":
pass
elif inputtext=="cancel":
self.gamelabel.config(text=gamelabel)
else:
inputtext=""
我已经尝试了所有我能想到的和Google。从将“数据”数组传递给函数,将其与先前的自我连接起来,然后将旧数组复制到新数组,其中最新的索引是最新的“数据”,ArrayLists,Stacks,.push()、. add() ,获取可能组合的总数并将其插入到全局数组索引中...什么都没有...我很着急。当然,理想情况下,结果应类似于:
static void combinationUtil(String[] arr, String data[], int start, int end, int index, int r, float[][] info) {
// Current combination is ready to be printed, print it
strat newStrat = new strat(0, 0, 0, null);
if (index == r) {
//THIS IS WHERE THE COMBINATION I WANT APPEARS
return;
}
for (int i = start; i <= end && end - i + 1 >= r - index; i++) {
data[index] = arr[i];
combinationUtil(arr, data, i + 1, end, index + 1, r, info);
}
return;
}
public static void getCombinations(String[] arr, int n, int r, float[][] info) {
String[] data = new String[r];
combinationUtil(arr, data, 0, n - 1, 0, r, info);
}
public static void main(String[] args) throws IOException, InterruptedException {
//Array I want to get all k 1:n combinations of
String[] array = { "TST1", "TST2", "TST3"}
//start a timer because that's always fun
long startTime = System.nanoTime();
//cycle through all 'pick k values'
for (int i = 1; i < 8; i++) {
getCombinations(array, n, i, info);
}
//Math's up. How Long did that take?
long endTime = System.nanoTime();
//IDEALLY PRINT THE COMBINATIONAL ARRAY HERE
System.out.println(Arrays.deepToString(_____));
//Don't forget to print the time ;)
System.out.println("Duration: "+(endTime - startTime)+" ns");
}
在这一点上甚至可以添加一点
[["TST1"], ["TST2"], ["TST3"], ["TST1", "TST2"], ["TST1", "TST3"], ["TST2", "TST3"], ["TST1", "TST2", "TST3"]
上面的代码运行良好,但组合仅出现在combinationUtil()中,而不是我要在main()中使用累积结果的位置。那么,我在做错什么呢?
答案 0 :(得分:1)
您要计算大小为n的数组中r元素的可能组合。您可以尝试此代码。我将函数称为nCr(不确定这是否是我们要解决的问题的正确数学符号)
public static void main(String[] args) {
String[] array2 = { "TST1", "TST2", "TST3"};
List<List<String>> l = new ArrayList<>();
for (var i: Arrays.asList(0, 1, 2, 3)) {
l.addAll(nCr(array2, i));
}
System.out.println(l);
}
private static List<List<String>> nCr(String[] array, int r) {
List<List<String>> result = new ArrayList<>();
if (r == 0) return result;
if (r == 1) return nC1(array);
for (int i = 0; i < array.length - r + 1; i++) {
List<List<String>> result2 = nCr(
Arrays.copyOfRange(array, i + 1, array.length),
r - 1);
for (var x: result2 ) {
x.add(array[i]);
result.add(x);
}
}
return result;
}
private static List<List<String>> nC1(String[] array) {
List<List<String>> l = new ArrayList<>();
for (var x: array) {
l.add(new ArrayList<>(Arrays.asList(x)));
}
return l;
}
输出:
[[TST1], [TST2], [TST3], [TST2, TST1], [TST3, TST1], [TST3, TST2], [TST3, TST2, TST1]]