我需要一个递归解决方案,该解决方案返回k个集合中n个子集的任何组合(在数学意义上)。我有一个ArrayList,我想从递归方法中返回所有可能的n尺寸子集。顺序无关紧要。 因此,如果我有一组员工{Jim,Tom,Ann,John},并且想要其中两个,我应该得到:
{Jim Tom} {Jim Ann} {Jim John} {Tom Ann} {Tom John} {Ann John}
我发现了这个https://stackoverflow.com/a/16256122/10929764 但它只会打印出结果。我对其进行了一些修改,以将任何组合添加到ArrayList并返回它,但是它无法正常工作。 这是代码:
puttygen <keyfile>.ppk -O private-openssh -o <outfile>
它会正确打印出所有组合,但始终将相同的值添加到ArrayList。所以allResults是
{Ann,John} {Ann,John} {Ann,John} {Ann,John} {Ann,John} {Ann,John}
代替:
{Jim Tom} {Jim Ann} {Jim John} {Tom Ann} {Tom John} {Ann John}
答案 0 :(得分:1)
您想知道为什么它能很好地打印,而返回的列表似乎在每个位置都具有完全相同的数组。
那是因为它是完全相同的数组(对相同对象的相同引用)。由于在您的解决方案中仅使用一个数组,因此在调用allResults.add(result)
时,会将引用添加到列表中唯一的数组。然后,当您寻找其他组合时,请继续对其进行修改。这就是为什么您的列表仅包含找到的最后一个组合的原因。
解决方案是,每次找到组合时都通过将当前数组的副本添加到列表中来添加新数组。只需替换
allResults.add(result);
通过
allResults.add(Arrays.copyOf(result, result.length));
这样,列表中的每个元素都指向一个不同的数组。