按自然班优先分组算法

来源:互联网 发布:手机淘宝补差价 编辑:程序博客网 时间: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;    }}
原创粉丝点击