Guava的方法Lists#partition
将List<?>
划分为List<List<?>>
,其中每个分区包含N
元素(由函数的第二个参数指定,但不包括最后一个分区)。
是否可以使用此方法,而是创建N
分区?
如果没有,有什么解决方法?
我尝试使用以下内容创建31
分区(keys
是大小为List<String>
的{{1}}),但仅创建了57
:
29
答案 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个分区,而最后一个分区仅包含一个元素的原因。
番石榴正在做它的工作。您没有足够的元素来正确细分为所需的分区。