按自然班优先分组算法
来源:互联网 发布:手机淘宝补差价 编辑:程序博客网 时间:2024/06/07 19:53
import java.util.ArrayList;import java.util.Comparator;import java.util.Iterator;import java.util.List;import com.alibaba.fastjson.JSON;// 按自然班优先分组算法// 11个学生// A,B,C三个班,分别有学生是5人3人1人, 还有2个没班级// 要分3组// A组4人 B组4人 C组3人public class TestAll { private int groupCount = 3;// 分组个数,可变 private int klassCount = 3;// 班级个数 private int studentTotalCount = 0;// 学生总数 private List<Klass> klassList = new ArrayList<Klass>(); private List<Group> groupList = new ArrayList<Group>(); public static void main(String[] args) { TestAll tt = new TestAll(); tt.dealGroup(); System.out.println(tt.groupList); } TestAll() { initData(); maskGroupList(); } /** * 数据初始化, */ void initData() { for (int i = 0; i < klassCount; i++) { klassList.add(new Klass('A' + i + "")); } Klass k = null; for (int i = 0; i < 9; i++) { String kName = ""; if (i < 5) { kName = "A班:"; k = klassList.get(0); } else if (i < 8) { kName = "B班:"; k = klassList.get(1); } else if (i < 9) { kName = "C班:"; k = klassList.get(2); } k.getStudentList().add(new Student(kName + "学生:" + i)); } // 没班级的两个学生 Klass noKSList = new Klass("无组虚拟班"); noKSList.getStudentList().add(new Student("无班:学生:" + 9)); noKSList.getStudentList().add(new Student("无班:学生:" + 10)); klassList.add(noKSList); } void dealGroup() { recall(getNextHasLeftSizeGroup(groupList), getLeftMaxStudentList(klassList)); sortGroupList(); } void sortGroupList() { groupList.sort(new Comparator<Group>() { @Override public int compare(Group o1, Group o2) { return o1.getName().compareTo(o2.getName()); } }); } void recall(Group group, List<Student> studentList) { if (group.getLeftSize() != 0) { Iterator<Student> studentIt = studentList.iterator(); while (studentIt.hasNext() && group.getLeftSize() != 0) { Student student = studentIt.next(); GroupMember groupMember = new GroupMember(); groupMember.setGroupId(group.getId()); groupMember.setName(student.getName()); group.getGroupMemberList().add(groupMember);// 此处做stuent到teammeber的转化 studentIt.remove(); group.setLeftSize(group.getLeftSize() - 1); } recall(getNextHasLeftSizeGroup(groupList), getLeftMaxStudentList(klassList)); } else { return; } } Group getNextHasLeftSizeGroup(List<Group> groupList) { groupList.sort(new Comparator<Group>() { @Override public int compare(Group o1, Group o2) { return o2.getLeftSize() - o1.getLeftSize(); } }); return groupList.get(0); } List<Student> getLeftMaxStudentList(List<Klass> klassList) { klassList.sort(new Comparator<Klass>() { @Override public int compare(Klass o1, Klass o2) { return o2.getStudentList().size() - o1.getStudentList().size(); } }); return klassList.get(0).getStudentList(); } /** * 根据总人数和组数确定每组人数 */ void maskGroupList() { for (Klass klass : klassList) { studentTotalCount += klass.getStudentList().size(); } int perCount = studentTotalCount / groupCount; int leftCount = studentTotalCount % groupCount; for (int i = 0; i < groupCount; i++) { int groupSize = perCount; if (leftCount != 0) { groupSize++; leftCount--; } groupList.add(new Group('A' + i + "", groupSize)); } }}/** * 班级 */class Klass { private String name = ""; private List<Student> studentList = new ArrayList<Student>(); Klass(String name) { this.name = name; } @Override public String toString() { return JSON.toJSONString(studentList); } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Student> getStudentList() { return studentList; } public void setStudentList(List<Student> studentList) { this.studentList = studentList; }}/** * 学生 */class Student { private String name = "" + Math.random(); public Student() { } public Student(String name) { this.name = name + "号" + this.name; } public String getName() { return name; } public void setName(String name) { this.name = name; }}/** * 组员 */class GroupMember { String name; String groupId; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGroupId() { return groupId; } public void setGroupId(String groupId) { this.groupId = groupId; }}/** * 组 */class Group { private String id = "" + Math.random(); private String name = ""; private int size = 0; // 组大小 private int leftSize = 0;// 的剩余空间 private List<GroupMember> groupMemberList = new ArrayList<GroupMember>(); Group() { } Group(String name) { this.name = name; } Group(String name, int size) { this.name = name; this.size = size; this.leftSize = size;// 默认剩余大小=初始化大小 } @Override public String toString() { int name = Integer.parseInt(this.name); return (char) name + "组:组大小:" + size + " 剩余位:" + leftSize + " :组内容" + JSON.toJSONString(groupMemberList); } public int getSize() { return size; } public String getId() { return id; } public void setId(String id) { this.id = id; } public void setSize(int size) { this.size = size; } public int getLeftSize() { return leftSize; } public void setLeftSize(int leftSize) { this.leftSize = leftSize; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<GroupMember> getGroupMemberList() { return groupMemberList; } public void setGroupMemberList(List<GroupMember> groupMemberList) { this.groupMemberList = groupMemberList; }}
阅读全文
0 0
- 按自然班优先分组算法
- 自然排序算法介绍
- 自然合并排序算法
- 算法-自然合并排序
- 分组算法
- 分组算法
- 递归归并排序和非递归归并排序(自然分组)
- 自然
- 自然
- Bayes自然图像抠图算法
- 算法 -- 归并排序之自然排序
- 自然归并排序算法时间复杂度分析
- 算法导论 矩阵乘法(自然定义法)
- 三个分组密码算法
- 分组密码算法分析
- 分组密码算法分析
- 分组密码算法分析
- 分组转发算法
- php 编译
- 网页特效
- Python 多线程的三种创建方式
- DSPF28335学习笔记
- 在IDEA中使用 Spring Initializr 新建 spring boots 项目
- 按自然班优先分组算法
- 由于CentOS的系统安装了epel-release-latest-7.noarch.rpm 导致在使用yum命令时出现Error: xz compression not available问题
- Distributed Transaction Patterns
- 关于C语言函数strtok引发的思考
- 线程池中DefaultThreadFactory类
- Android StudioRe-download dependencies and sync project (requires network)问题
- leetcode 20. Valid Parentheses
- java静态代码块/静态属性、构造块、构造方法执行、main方法、普通代码块的顺序
- 从开发到部署会用到的 Docker 命令