假设我们要给出一些项目的列表列表,比如字符串。
list 1: "a", "b", "c"
list 2: "d", "e", "f"
list 3: "1", "2", "3"
results: (a, d, 1), (a, d, 2), ... (c, f, 3)
(真正的用例与字符串等无关,这只是一个模型)
我写了一个递归方法来做到这一点,但我对它不满意,因为它创建了很多被扔掉的临时集(是的,我知道在 java 中创建对象很便宜,通常 cpu 指令比 C 中的 malloc 少(源: Java Concurrency in Action, p241),eden GC 很便宜,等等等等。幽默我 :)。
void combine(List<List<String>> itemLists, List<Set<String>> combinations, Set<String> partial) {
if (itemLists == null || itemLists.isEmpty()) return;
List<String> items = itemLists.get(0);
for (String s : items) {
Set<String> tmpSet = new HashSet<>(partial);
tmpSet.add(s);
if (itemLists.size() == 0) //termination test
combinations.add(tmpSet);
else
combine(itemLists.subList(1, itemLists.size()), combinations, tmpSet);
}
}
那么,你会怎么做呢?
编辑:要清楚,我不想创建排列。我想创建 sizeof(list of lists) 大的集合。