【问题标题】:How can I iterate over all possibilites to split one ArrayList in two ArrayLists of size k and (n-k)?如何遍历所有可能性,将一个 ArrayList 拆分为两个大小为 k 和 (n-k) 的 ArrayList?
【发布时间】:2014-11-26 20:11:21
【问题描述】:

我正在寻找一种遍历所有可能性的方法,将一个数组列表拆分为两个数组列表,其中第一个有 k 个元素,第二个有其余元素。

例如,我会在 Python 中编写

import itertools
my_set = {1,2,3,4,5}
k = 2
map(lambda x: (set(x), my_set-set(x)), itertools.combinations(my_set, k))

这会给:

[(set([1, 2]), set([3, 4, 5])),
 (set([1, 3]), set([2, 4, 5])), 
 (set([1, 4]), set([2, 3, 5])), 
 (set([1, 5]), set([2, 3, 4])), 
 (set([2, 3]), set([1, 4, 5])), 
 (set([2, 4]), set([1, 3, 5])), 
 (set([2, 5]), set([1, 3, 4])), 
 (set([3, 4]), set([1, 2, 5])), 
 (set([3, 5]), set([1, 2, 4])), 
 (set([4, 5]), set([1, 2, 3]))]

如何在 Java 中获取给定集合(嗯,ArrayList)的所有 k 元素子集?

【问题讨论】:

标签: java algorithm arraylist


【解决方案1】:

使用来自 Guava 的 Collections2,就像在 cmets 中的 @zapl 中提到的那样,您可以在 Java8 中执行类似的操作:

final List<Integer> xs = Arrays.asList(1, 2, 3, 4, 5);
final int k = 2;
Collections2.permutations(xs)
    .stream()
    .map(list -> Arrays.asList(new HashSet<>(list.subList(0, k)),
        new HashSet<>(list.subList(k, xs.size()))))
    .distinct()
    .forEach(System.out::println);

这会导致

[[1, 2], [3, 4, 5]]
[[1, 5], [2, 3, 4]]
[[1, 4], [2, 3, 5]]
[[4, 5], [1, 2, 3]]
[[1, 3], [2, 4, 5]]
[[3, 5], [1, 2, 4]]
[[3, 4], [1, 2, 5]]
[[2, 3], [1, 4, 5]]
[[2, 5], [1, 3, 4]]
[[2, 4], [1, 3, 5]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 2011-02-23
    • 2015-08-14
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多