给定每个组的最大对象数量,如何在组中平均划分对象数量(Java)

时间:2019-01-10 15:41:04

标签: java

我正在做一个学校项目,其中有一个包含对象的ArrayList。我必须将这些对象平均分配到组(其他ArrayList)上,每组最大数量的对象(maximumGroupSize)。

如何拆分这些对象,以使它们均匀地分布在各组上,并且将最小组数指定为maximumGroupSize?

我尝试了以下代码:

public List<List<Object>> createGroups(List<Object> objects, int maximumGroupSize) {
    float totalObjectCount = objects.size();
    float maxGroupSize = maximumGroupSize;
    List<List<Object>> groups = new ArrayList<>();
    for (int i = 0; i < java.lang.Math.ceil(totalObjectCount / maximumGroupSize); i++){
        List<Object> group = new ArrayList<>();
        for (int j = (i*maximumGroupSize); j < maximumGroupSize*(i+1);j++){
            if (j<objects.size()) {
                group.add(objects.get(j));
            }
        }
        groups.add(group);
    }
    return groups;
}

这将导致第一个组全部具有最大容量。但是最后创建的组将包含“剩菜剩饭”。

因此,如果我有一个总共18个对象的列表,并且maximumGroupSize = 8,它将导致两组8个对象和2个对象之一。

如果可能的话,我希望组的大小尽可能地接近。

因此,使用上述输入将输出三个6个列表。

我正在用Java工作,所以我需要一种用Java来做的方法。代码会很棒,但是也可以一步一步地拆分,所以我可以自己创建代码。

2 个答案:

答案 0 :(得分:0)

如果为您提供了拆分组允许的最大组大小,则可以使用它来计算最小组数。

这可以通过使用原始ArrayList的长度来完成。将原始列表中的对象数除以最大组数,并以该上限为上限,以获取最小组数。

因此,例如,如果给定一个包含11个对象的对象的ArrayList,并且最大组大小为2,则最小组数为6。

现在您可以从中创建所需数量的所需ArrayList。一旦有了这些ArrayList,就可以很容易地将原始列表拆分成这些。

答案 1 :(得分:0)

由于您现在已经提供了尝试的代码,所以这是我的解决方案,由于您没有尝试过,所以我没有发布过它:-

public static void main(String[] args) {
    List<Integer> list = IntStream.range(10, 20)
            .boxed()
            .collect(Collectors.toList());
    List<Integer> groups[] = createGroups(list, 4);
    for (List<Integer> group : groups) {
        System.out.println(group);
    }
}

public static List<Integer>[] createGroups(List<Integer> list, int maximumPerGroup) {
    int numberOfGroups = list.size() / maximumPerGroup;
    if (list.size() % maximumPerGroup > 0) numberOfGroups++;
    List<Integer> groups[] = new ArrayList[numberOfGroups];
    for (int i = 0; i < list.size(); i++) {
        if (groups[i % numberOfGroups] == null) groups[i % list.size()] = new ArrayList<>();
        groups[i % numberOfGroups].add(list.get(i));
    }
    return groups;
}

输出

[10, 13, 16, 19]
[11, 14, 17]
[12, 15, 18]