【发布时间】:2020-07-06 11:41:07
【问题描述】:
我想在 Java 中以所有可能的方式将一个列表拆分为给定数量的 n 个子列表。
例如 [1, 2, 3, 4] 其中 n = 3 将包括以下列表(但不是完整的解决方案 - 完整需要更多空间):
([], [], [1,2,3,4])
([],[1],[2,3,4])
([],[1,2],[3,4])
([],[1,2,3],[4])
([],[1,2,3,4],[])
([1],[2,3,4], [])
([1],[2,3],[4])
([2,3],[4],[1])
([4],[],[1,2,3])
...
等
我从另一个类似问题 (Split a list into two sublists in all possible ways) 中调整了一个解决方案,但它仅适用于创建 2 个子列表的列表,我正在努力掌握如何实现它以实现灵活而不是硬编码的子列表数量。
这是我的代码:
public List<List<EGroup>> permutation(List<E> list) {
List<List<E>> sublists = new ArrayList<List<E>>();
for (int i = 0; i <= list.size(); i++) {
permutationSplit(list, sublists, i, new ArrayList<E>(), 0);
}
List<List<EGroup>> listOfEGroupPairs = new ArrayList<List<EGroup>>();
for (List<E> subList : sublists) {
List<E> listCopy = new ArrayList<E>(list);
listCopy.removeAll(subList);
EGroup e1 = new EGroup(subList);
EGroup e2 = new EGroup(listCopy);
List<EGroup> egr = new ArrayList<EGroup>();
egr.add(e1);
egr.add(e2);
listOfEGroupPairs.add(egr);
}
return listOfEGroupPairs;
}
public void permutationSplit(List<E> list, List<List<E>> subLists, int sublistSize, List<E> currentSubList,
int startIndex) {
if (sublistSize == 0) {
subLists.add(currentSubList);
} else {
sublistSize--;
for (int i = startIndex; i < list.size(); i++) {
List<E> newSubList = new ArrayList<E>(currentSubList);
newSubList.add(list.get(i));
permutationSplit(list, subLists, sublistSize, newSubList, i + 1);
}
}
}
我需要创建 n 个 EGroup 对象以添加到 listOfEGroupPairs 而不是硬编码的 2,但是如何始终在每个循环中获得正确数量 (n) 的不同大小的子列表?
【问题讨论】:
-
您还没有列出像 [1,4],[2,3] 这样的子列表 - 您需要它们还是要保持顺序?
-
对不起,我将编辑问题以使其更清楚。我不想保持秩序,想要所有可能的组合。虽然理想情况下,每个子列表中的组合是不必要的,例如 ([1,4],[2,3],[]) 和 ([4,1],[2,3],[]) 是相同的,但我目前的2 子列表解决方案没有考虑到这一点,我可以稍后再考虑