我想在java中创建一个接收两个字符串列表的方法:list1
,list2
和两个整数:i1
和i2
。该方法必须返回包含(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
答案 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);