概述
这里我简要叙述下我这边的业务
- 实体类有 学生StudentVo,学生分组StudentGroup
- 整体思路:
- 求出应该平均出来的每组的学生数(取整)
- 随机从样本池中拿出上面求出的学生数
- 将拿出的学生随机分配成给定的组数
- 若第一步不能整除,则进行本步骤,拿出剩余未被整除的学生,随机分配到上面已经分好的组中,每组有且仅有一个名额
- 主要用到了set集合,迭代器Iterator,随机器random
直接上代码了
//本步骤是我本人的业务处理部分 大家可以直接从randomGroup()开始浏览
public Result<?> random(List<StudentVo> studentVos, int groupNum) {
int studentSize = studentVos.size();
if (groupNum > studentSize) {
return Result.error("组数不能大于学生总数!");
}
List<String> ids = this.randomGroup(studentVos, studentSize, groupNum);
List<StudentGroup> studentGroups = new ArrayList<>();
for (int i = 0; i < ids.size(); i++) {
StudentGroup studentGroup = new StudentGroup();
studentGroup.setFileShare(0);
studentGroup.setGroupName("第" + (i + 1) + "组");
StudentVo leader = studentCollegeMapper.selectOneByUid(ids.get(i).split(",")[0]);
studentGroup.setLeaderUser(leader);
studentGroup.setLeader(ids.get(i).split(",")[0]);
studentGroup.setSids(ids.get(i));
List<StudentVo> voList = studentCollegeMapper.selectListByUids(ids.get(i).split(","));
studentGroup.setStudentGroups(voList);
studentGroups.add(studentGroup);
}
Result<List<StudentGroup>> result = new Result<>();
result.setMessage("分组完成。");
result.setResult(studentGroups);
result.setCode(200);
result.setSuccess(true);
return result;
}
下面是随机代码,上面是业务的处理
/**
* @param studentVos 学院队的所有学生
* @param groupNum 分组个数
* @return
*/
private List<String> randomGroup(List<StudentVo> studentVos, int studentSize, int groupNum) {
List<String> idList = new ArrayList<>();
Random random = new Random();
// step1 求出平均每组的学生数
int groupSize = studentSize / groupNum;
// step2.1 随机拿出能平均的所有学生
Set<StudentVo> stuSet = this.randomGetStu(studentVos, groupSize * groupNum, random);
// step2.2 将学生每组平均分配
Collection<StudentVo> copy = new HashSet<StudentVo>(stuSet);
Iterator<StudentVo> iterator = copy.iterator();
while (iterator.hasNext()) {
StringJoiner ids = new StringJoiner(",");
for (int i = 0; i < groupSize && iterator.hasNext(); i++) {
StudentVo next = iterator.next();
ids.add(next.getUid());
iterator.remove();
}
idList.add(ids.toString());
}
// step3 将剩余的学生随机分配到分好的每个组内
studentVos.removeAll(stuSet);
Iterator<StudentVo> leftStu = studentVos.iterator();
int flag = 0;
while (leftStu.hasNext() && flag < idList.size()) {
String concat = idList.get(flag).concat("," + leftStu.next().getUid());
idList.set(flag,concat);
flag++;
}
return idList;
}
/**
* 随机拿出学生
*
* @param studentVos
* @param backNum
* @param random
* @return
*/
private Set<StudentVo> randomGetStu(List<StudentVo> studentVos, int backNum, Random random) {
Set<StudentVo> newStudents = new HashSet<>();
while(newStudents.size() != backNum){
int target = random.nextInt(studentVos.size());
newStudents.add(studentVos.get(target));
}
return newStudents;
}
效率的话有点低,后面有时间的话可以优化下
20条学生数据,分3组,分组完成后,共用时400ms,当然是通过本地swagger测试的时间.
最后
以上就是魁梧洋葱为你收集整理的java-根据分组数随机生成分组的全部内容,希望文章能够帮你解决java-根据分组数随机生成分组所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复