如何用N个分区而不是大小为N的分区对列表进行分区?

时间:2018-07-31 14:59:59

标签: java list guava partitioning

Guava的方法Lists#partitionList<?>划分为List<List<?>>,其中每个分区包含N元素(由函数的第二个参数指定,但不包括最后一个分区)。

是否可以使用此方法,而是创建N分区?

如果没有,有什么解决方法?

我尝试使用以下内容创建31分区(keys是大小为List<String>的{​​{1}}),但仅创建了57

29

2 个答案:

答案 0 :(得分:5)

问题在于,您自定义的分区分配的“空空间”(即缺少元素以完全填充分区所留下的空隙)与Guava的分配方法不同。该方法将在创建下一个分区之前完全填充每个分区,同时您要均匀分配元素。这是因为partition()定义了组的 size ,而您要指定组的数量

看看这个自定义实现:

private static <T> List<List<T>> distribute(List<T> elements, int nrOfGroups)
{
    int elementsPerGroup = elements.size() / nrOfGroups;
    int leftoverElements = elements.size() % nrOfGroups;

    List<List<T>> groups = new ArrayList<>();
    for (int i = 0; i < nrOfGroups; i++)
    {
        groups.add(elements.subList(i * elementsPerGroup + Math.min(i, leftoverElements),
                                    (i + 1) * elementsPerGroup + Math.min(i + 1, leftoverElements)));
    }
    return groups;
}

它将计算组的最小大小(计数/#groups的楼层个),然后在剩余元素的情况下针对前几个组进行校正。

示例

List<Integer> elements = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
int nrOfGroups = 6;
// [[1, 2], [3, 4], [5], [6], [7], [8]]

答案 1 :(得分:3)

要创建N个分区,必须至少有2N个元素。在您的情况下,您的分区要求为31,这意味着您需要62个元素。

因为有57个元素,所以您有五个元素-或两个半分区-缺少所需的最小值,这就是为什么要获得29个分区,而最后一个分区仅包含一个元素的原因。

番石榴正在做它的工作。您没有足够的元素来正确细分为所需的分区。