正如您可能已经从标题中理解的那样,我需要一些聪明的思考:)
我有一个 List<List<Object>>
目的。如果您将 Object 对象视为整数,您可以这样看:
{{1,2},{10,20,30},{100}}
我需要得到所有可能的列表,其中只包含每个列表的一个元素,也就是说,想出这个:
{{1,10,100},{1,20,100},{1,30,100},{2,10,100},{2,20,100},{2,30,100}}
当然,在编译时您并不知道列表将包含多少项,因此您不能依赖 for
的重叠。循环...
你是怎么想到这个的?时间限制与我的问题无关,因为列表可能包含的元素很少。
最佳答案
迭代算法。
public class A {
public static List<List<Integer>> combinations(List<List<Integer>> inputList) {
List<List<Integer>> result = new LinkedList<List<Integer>>();
for (Integer i : inputList.get(0)) {
List<Integer> temp = new ArrayList<Integer>(1);
temp.add(i);
result.add(temp);
}
for (int i = 1; i < inputList.size(); i++) {
result = make(result, inputList.get(i));
}
return result;
}
private static List<List<Integer>> make(List<List<Integer>> in, List<Integer> n) {
List<List<Integer>> res = new LinkedList<List<Integer>>();
for (List<Integer> l : in) {
for (Integer i : n) {
List<Integer> cur = new ArrayList<Integer>(l.size() + 1);
cur.addAll(l);
cur.add(i);
res.add(cur);
}
}
return res;
}
public static void main(String[] args) {
List<List<Integer>> inputList = new ArrayList();
inputList.add(new ArrayList<Integer>() {{
add(1);
add(2);
}});
inputList.add(new ArrayList<Integer>() {{
add(10);
add(20);
add(30);
}});
inputList.add(new ArrayList<Integer>() {{
add(100);
}});
System.out.println(combinations(inputList));
}
}
*请注意,此代码不适用于生产!您应该将 LinkedList
替换为具有初始大小的 ArrayList
,进行检查等。
upd 提供了使用示例。有一些代码改进。但它仍然只是草稿。我不建议您在实际任务中使用它。
关于java - 如何获取所有列表的列表,其中恰好包含列表列表的每个列表的一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5220701/