我是靠谱客的博主 魁梧洋葱,最近开发中收集的这篇文章主要介绍java-根据分组数随机生成分组,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

这里我简要叙述下我这边的业务

  • 实体类有 学生StudentVo,学生分组StudentGroup
  • 整体思路:
    1. 求出应该平均出来的每组的学生数(取整)
    2. 随机从样本池中拿出上面求出的学生数
    3. 将拿出的学生随机分配成给定的组数
    4. 若第一步不能整除,则进行本步骤,拿出剩余未被整除的学生,随机分配到上面已经分好的组中,每组有且仅有一个名额
  • 主要用到了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-根据分组数随机生成分组所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(74)

评论列表共有 0 条评论

立即
投稿
返回
顶部