Java 递归,在每个步骤导出信息

Java 递归,在每个步骤导出信息,java,arrays,recursion,linked-list,combinations,Java,Arrays,Recursion,Linked List,Combinations,我正在编写输出字符串数组所有组合的代码。 我可以使用doCombine方法打印数组,但在将该数组添加到LinkedList时,它会添加仅包含Ds的数组。如何将每个数组传递到列表 public LinkedList<String[]> allCombinations = new LinkedList<String[]>(); public static void main(String[] args) { String[] arr = {"A", "B", "C"

我正在编写输出字符串数组所有组合的代码。 我可以使用
doCombine
方法打印数组,但在将该数组添加到
LinkedList
时,它会添加仅包含
D
s的数组。如何将每个数组传递到列表

public LinkedList<String[]> allCombinations = new LinkedList<String[]>();

public static void main(String[] args) {
    String[] arr = {"A", "B", "C", "D"};

    Combinations c = new Combinations();

    c.combine(arr, 0);
    c.combine(arr, 1);
    c.combine(arr, 2);
    c.combine(arr, 3);
    c.combine(arr, 4);
    c.printList();

}

private void combine(String[] arr, int r) {
    String[] res = new String[r];
    doCombine(arr, res, 0, 0, r);
}

private void doCombine(String[] arr, String[] res, int currIndex, int level, int r) {
    if (level == r) {

        printArray(res);
        //Here it doesn't work
        allCombinations.add(res);
        return;
    }
    for (int i = currIndex; i < arr.length; i++) {
        res[level] = arr[i];
        doCombine(arr, res, i + 1, level + 1, r);

        if (i < arr.length - 1 && arr[i].equals(arr[i + 1])) {
            i++;
        }
    }
}

private void printArray(String[] res) {

    for (int i = 0; i < res.length; i++) {
        System.out.print(res[i] + " ");
    }
    System.out.println();
}

public void printList() {
    for (int i = 0; i < allCombinations.size(); i++) {
        printArray(allCombinations.get(i));
    }

}
public LinkedList allCombinations=new LinkedList();
公共静态void main(字符串[]args){
字符串[]arr={“A”、“B”、“C”、“D”};
组合c=新组合();
c、 联合收割机(arr,0);
c、 联合收割机(arr,1);
c、 联合收割机(arr,2);
c、 联合收割机(arr,3);
c、 联合收割机(arr,4);
c、 打印列表();
}
专用void合并(字符串[]arr,int r){
字符串[]res=新字符串[r];
doCombine(arr、res、0、0、r);
}
私有void文档组合(字符串[]arr,字符串[]res,int currendex,int level,int r){
如果(级别==r){
打印阵列(res);
//在这里它不起作用
所有组合。添加(res);
返回;
}
对于(int i=currendex;i
我假设
所有组合
列表
(链接列表)的实现

我认为您的错误在于,当您执行
所有组合.add(res)
时,您会在
列表中添加对对象
res
的引用,但此对象在
add
之后会被修改

因此,当您在
add
之前打印
res
时,您打印当前值,但在列表中,您有N个对同一对象
res
的引用,该引用以“D”系列结尾(当您打印列表时,您打印的是
res
最后一个值的N倍)

添加列表时,必须克隆列表的当前值,它将起作用:

private void doCombine(String[] arr, String[] res, int currIndex, int level, int r) {
    if (level == r) {

        printArray(res);
        //Here it doesn't work
        allCombinations.add(res.clone());
        return;
    }
    for (int i = currIndex; i < arr.length; i++) {
        res[level] = arr[i];
        doCombine(arr, res, i + 1, level + 1, r);

        if (i < arr.length - 1 && arr[i].equals(arr[i + 1])) {
            i++;
        }
    }
}
private void doCombine(String[]arr,String[]res,int currendex,int level,int r){
如果(级别==r){
打印阵列(res);
//在这里它不起作用
添加(res.clone());
返回;
}
对于(int i=currendex;i
请确认所需的输出是什么?我正在尝试将每个字符串数组添加到allCombinations中,并在以后的另一个类中访问它。我从未想过这一点。谢谢你:)你帮我省了点麻烦,教了我这一点。再次非常感谢。非常感谢;p我很高兴能帮上忙。