组合方法返回问题

时间:2014-03-02 20:37:23

标签: java

我写了一个方法来找到所有组合n选择k。当我让它无效并简单地打印出解决方案时它工作正常。但是,我正在尝试将其更改为返回所有组合中的List<List<Integer>>。我尝试返回解决方案并分别在if-else中返回递归调用但是我得到了一个错误,因为无法访问的代码行。下面我试图通过递归来携带列表列表并最终返回它。

public class Combos {
    public static void main(String[] args) {
        List<Integer> n = new ArrayList<Integer>();
        for (int i = 0; i < 9; i++) {
            n.add(i);
        }
        List<Integer> temp = new ArrayList<Integer>();
        List<List<Integer>> combos = new ArrayList<List<Integer>>();
       // findCombos(n, temp, 3, combos);
        System.out.println(findCombos(n, temp, 3, combos));
    }
    public static List<List<Integer>> findCombos(List<Integer> n, List<Integer> temp, int k, List<List<Integer>> combos) {
        if (k == 0) {
            //System.out.print(temp);
            combos.add(temp);
        }
        else {
            for (int i = 0; i < n.size(); i++) {
                temp.add(n.get(i));
                List<Integer> subList = n.subList(i + 1, n.size());
                findCombos(subList, temp, k - 1, combos);
                temp.remove(temp.size() - 1);
            }
        }
        return combos;
    }
}

工作空白方法在这里:

package client;

import java.util.ArrayList;
import java.util.List;

public class Combos {
    public static void main(String[] args) {
        List<Integer> n = new ArrayList<Integer>();
        for (int i = 0; i < 5; i++) {
            n.add(i);
        }
        List<Integer> temp = new ArrayList<Integer>();
        findCombos(n, temp, 3);
    }
    public static void findCombos(List<Integer> n, List<Integer> temp, int k) {
        if (k == 0) {
           System.out.print(temp);
        }
        else {
            for (int i = 0; i < n.size(); i++) {
                temp.add(n.get(i));
                List<Integer> subList = n.subList(i + 1, n.size());
                findCombos(subList, temp, k - 1);
                temp.remove(temp.size() - 1);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

这与temp列表以及它在添加到combos时始终是同一个对象的方式有关。

更改此行将更正:

if (k == 0) {
    combos.add(new ArrayList<Integer>(temp));
}

您必须制作副本,因为temp正在变异。之后,输出为:

[[0, 1, 2], [0, 1, 3], [0, 1, 4], [0, 1, 5], [0, 1, 6], [0, 1, 7], [0, 1, 8], [0, 2, 3], [0, 2, 4], [0, 2, 5], [0, 2, 6], [0, 2, 7], [0, 2, 8], [0, 3, 4], [0, 3, 5], [0, 3, 6], [0, 3, 7], [0, 3, 8], [0, 4, 5], [0, 4, 6], [0, 4, 7], [0, 4, 8], [0, 5, 6], [0, 5, 7], [0, 5, 8], [0, 6, 7], [0, 6, 8], [0, 7, 8], [1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 2, 6], [1, 2, 7], [1, 2, 8], [1, 3, 4], [1, 3, 5], [1, 3, 6], [1, 3, 7], [1, 3, 8], [1, 4, 5], [1, 4, 6], [1, 4, 7], [1, 4, 8], [1, 5, 6], [1, 5, 7], [1, 5, 8], [1, 6, 7], [1, 6, 8], [1, 7, 8], [2, 3, 4], [2, 3, 5], [2, 3, 6], [2, 3, 7], [2, 3, 8], [2, 4, 5], [2, 4, 6], [2, 4, 7], [2, 4, 8], [2, 5, 6], [2, 5, 7], [2, 5, 8], [2, 6, 7], [2, 6, 8], [2, 7, 8], [3, 4, 5], [3, 4, 6], [3, 4, 7], [3, 4, 8], [3, 5, 6], [3, 5, 7], [3, 5, 8], [3, 6, 7], [3, 6, 8], [3, 7, 8], [4, 5, 6], [4, 5, 7], [4, 5, 8], [4, 6, 7], [4, 6, 8], [4, 7, 8], [5, 6, 7], [5, 6, 8], [5, 7, 8], [6, 7, 8]]

作为正在发生的事情的一个例子,如果k为1,我们可以按照逻辑进行几个步骤:

// k is 1 so call findCombos with 0
findCombos(subList, temp, k - 1, combos);

// k is 0 so add temp to combos
if (k == 0) {
    combos.add(temp);
}

// on return, immediately mutate temp
temp.remove(temp.size() - 1);