来自一个列表的N个元素的所有可能组合,具有来自另一个列表的M个元素

时间:2016-06-08 23:43:39

标签: java arraylist combinations

我想在java中创建一个接收两个字符串列表的方法:list1list2和两个整数:i1i2。该方法必须返回包含(List<List<String>> + i1)个元素的所有可能不同列表组合的列表列表(i2),以便这些组合具有i1元素来自list1的{​​{1}}和i2元素。

示例:

list2

-Lists没有重复元素。

- 一个列表中的元素不会出现在另一个列表中。

- 我不需要两个具有相同元素的不同列表:(如果我有{A,1}我不需要{1,A})。

我目前的解决方案仅适用于固定大小的list1 = {A,B,C}; list2 = {1,2,3,4}; example1: i1 = 1; i2 = 3; method(lis1,i1,list2,i2) results: {{A,1,2,3};{A,2,3,4};{A,1,3,4};{A,1,2,3} {B,1,2,3};{B,2,3,4};{B,1,3,4};{B,1,2,3} {C,1,2,3};CA,2,3,4};{C,1,3,4};{C,1,2,3}} //////////////////////////////////////////////////////////////////// example2: i1 = 2; i2 = 2; method(lis1,i1,list2,i2) results: {{A,B,1,2};{A,B,1,3};{A,B,1,4};{A,B,2,3};{A,B,2,4};{A,B,3,4}; {A,C,1,2};{A,C,1,3};{A,C,1,4};{A,C,2,3};{A,C,2,4};{A,C,3,4}; {B,C,1,2};{B,C,1,3};{B,C,1,4};{B,C,2,3};{B,C,2,4};{B,C,3,4}} /////////////////////////////////////////////////////////////// example3: i1 = 2; i2 = 1; method(lis1,i1,list2,i2) results: {{A,B,1};{A,B,2};{A,B,3};{A,B,4} {A,C,1};{A,C,2};{A,C,3};{A,C,4}; {B,C,1};{B,C,2};{B,C,3};{B,C,4};} /////////////////////////////////////////////////////////////// example4: i1 = 0; i2 = 1; method(lis1,i1,list2,i2) results: {{1};{2};{3};{4}} /////////////////////////////////////////////////////////////// i1,我会根据这个问题进行调整:(Algorithm to return all combinations of k elements from n

有人可以告诉我这个问题的任何算法或结构吗?

谢谢!

编辑:(添加了我的一些代码)

i2

1 个答案:

答案 0 :(得分:0)

my comment到问题:

  

您编写递归方法,以生成N的{​​{1}}值的所有组合。返回值为List<E>。你称它为两次,每个列表一次。然后创建一个方法来生成两个List<List<E>>的所有组合,其中result是一个值列表,每个列表值是列表1中列表值与列表2中列表值的串联。 / p>

以下是代码:

List<List<E>>

<强> TEST

@SuppressWarnings("unchecked")
public static <T> List<List<T>> combos(int len, List<T> list) {
    if (len <= 0 || len > list.size())
        throw new IllegalArgumentException();
    List<List<T>> result = new ArrayList<>();
    combos(list, 0, Arrays.asList((T[])new Object[len]), 0, result);
    return result;
}
private static <T> void combos(List<T> list, int listIdx, List<T> values, int valueIdx, List<List<T>> result) {
    if (valueIdx == values.size()) {
        result.add(new ArrayList<>(values));
        return;
    }
    int lastIdx = list.size() - (values.size() - valueIdx);
    for (int i = listIdx; i <= lastIdx; i++) {
        values.set(valueIdx, list.get(i));
        combos(list, i + 1, values, valueIdx + 1, result);
    }
}
public static <T> List<List<T>> combos(List<List<T>> list1, List<List<T>> list2) {
    List<List<T>> result = new ArrayList<>(list1.size() * list2.size());
    for (List<T> value1 : list1)
        for (List<T> value2 : list2) {
            List<T> combo = new ArrayList<>(value1.size() + value2.size());
            combo.addAll(value1);
            combo.addAll(value2);
            result.add(combo);
        }
    return result;
}

<强>输出

List<List<Integer>> result = combos(combos(3, Arrays.asList(0,1,2,3,4)),
                                    combos(2, Arrays.asList(5,6,7,8,9)));
for (List<Integer> list : result)
    System.out.println(list);