我需要一个递归的解决方案,它返回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并返回它,但是它不能正常工作。
这里有一个代码:

    public ArrayList<Employee[]> combinationsOfEmployee(ArrayList<Employee>sourceList, int selected, int startIndex, Employee[] result, ArrayList<Employee[]>allResults){
        if(selected == 0){
            for(int i=0; i<result.length; i++){
                System.out.print(result[i].getLastName() + "  ");
            }
            System.out.println("");
            allResults.add(result);
            return allResults;
        }
        for(int i=startIndex; i<=sourceList.size() - selected; i++){
            result[result.length - selected] = sourceList.get(i);
            combinationsOfEmployee(sourceList, selected - 1, i + 1, result, allResults);
        }
        return allResults;
    }

它正确地打印出所有组合,但始终向arraylist添加相同的值。所以所有的结果都是
{安,约翰}{安,约翰}{安,约翰}{安,约翰}{安,约翰}{安,约翰}
而不是:
{Jim Tom}{Jim Ann}{Jim John}{Tom Ann}{Tom John}{Ann John}

最佳答案

您想知道为什么它打印得很好,而返回的列表似乎在每个位置都有完全相同的数组。
这是因为它是完全相同的数组(对同一对象的相同引用)。因为在您的解决方案中,您只使用一个数组,所以当您调用allResults.add(result)时,将引用添加到列表中的唯一数组。然后在寻找其他组合时继续修改它。这就是为什么你的列表只包含最后找到的组合。
解决方法是每次找到组合时,通过将当前数组的副本添加到列表中来添加新数组简单地替换

allResults.add(result);

通过
allResults.add(Arrays.copyOf(result, result.length));

这样,列表中的每个元素都指向不同的数组。

关于java - 如何从递归方法正确返回ArrayList <Object>而没有重复的值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54250376/

10-12 21:25