从Set创建子集列表

时间:2018-03-16 13:33:26

标签: java

我有一套

Set<Long> entityIds;

我想把它分成10件装。最终得到一组集合,每组10个元素,如下所示:

List<Set<Long>> batches

我该怎么办?

我的解决方案:

private List<Set<T>> splitSet(Set<T> input) {
        List<Set<T>> batches = new ArrayList<>();
        for (int p = 0; p <= input.size(); p += 10) {
            Set<T> partSet = input.stream().skip(p).limit(10).collect(Collectors.toSet());
            batches.add(partSet);
        }
        return batches;
    }

2 个答案:

答案 0 :(得分:2)

您可以使用队列或堆栈,只需弹出/拉动元素

private static <T> List<Set<T>> extract(Set<T> set, int size){
    List<Set<T>> result = new ArrayList<>();
    Queue<T> queue = new LinkedList<>(set);

    while (!queue.isEmpty() && size > 0){
        Set<T> subSet = new HashSet<>();
        while (subSet.size() < size && !queue.isEmpty()){
            subSet.add(queue.poll());
        }
        result.add(subSet);
    }

    return result;
}

答案 1 :(得分:1)

我可能会这样做:

static <T> List<Set<T>> splitSet(Set<T> set, int n) {
    List<Set<T>> split = new ArrayList<>();
    int count = 0;
    Set<T> newSet = new HashSet<>();
    for (T id : set) {
        if (++count % n == 0) {
            split.add(newSet);
            newSet = new HashSet<>();
        }
        newSet.add(id);
    }
    if (!newSet.isEmpty()) {
        split.add(newSet);
    }
    return split;
}

public void test(String[] args) throws Exception {
    Set<Long> ids = new HashSet<>();
    for (long i = 0; i < 98; i++) {
        ids.add(i);
    }
    System.out.println(splitSet(ids, 10));
}