我正在做一个学校项目,其中有一个包含对象的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来做的方法。代码会很棒,但是也可以一步一步地拆分,所以我可以自己创建代码。
答案 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]