java代码实现年会座位的随机分配

来源:互联网 发布:qq三国js装备好坏 编辑:程序博客网 时间:2024/05/02 16:54

      最近人事找我,让我完成一个app,为了高逼格,人事让实现人脸识别签到,签完到后进行座位的随机分配。主要是为了让不同部门的人坐在一起,促进部门人员之间的交流。人脸识别这块不难,直接用了讯飞的人脸识别模块,难的是座位的随机分配啊,这对于长期只会复制粘贴的我来说,写个小程序真的很难。但是没办法,还得自己写,网上又找不到demo。我就把demo贴出来了哈,注释写在上面:

class Desk{    int leftPositions=10; //桌子的剩余座位数    int deskNumber=0;//座位的桌号    public int getLeftPositions() {        return leftPositions;    }    public void setLeftPositions(int leftPositions) {        this.leftPositions = leftPositions;    }    public int getDeskNumber() {        return deskNumber;    }    public void setDeskNumber(int deskNumber) {        this.deskNumber = deskNumber;    }    public Desk(int deskNumber) {        this.deskNumber = deskNumber;    }}
public class DeskUtil {    public static int deskNumbers = 3;//定义座位总的桌数    public static List<Desk> list = new ArrayList<>();    public static Desk onePositionDesk = null;    static {        //分配桌数        for (int i = 0; i < deskNumbers; i++) {            Desk desk = new Desk(i + 1);            list.add(desk);        }    }    public static String withFamilyMembers(int totalPersons) {        if(list.size()>0){        int maxDeskNumber = 0;//拥有最大剩余座位的序号,注意座位的序号不代表座位的桌号。        int minDeskNumber = 0;//拥有最小剩余座位的序号        for (int i = 0; i < list.size(); i++) {  //遍历查询满足特定座位数的拥有最少剩余座位的桌子的序号,例如:totalPersons为3,总共有三桌,1号桌剩余3,2号桌剩余4,3号桌剩余5,此时选择1号桌的三个位置。            Desk targetDesk = list.get(i);            if (targetDesk.getLeftPositions() >= totalPersons && targetDesk.getLeftPositions() <= list.get(minDeskNumber).getLeftPositions())                minDeskNumber = i;        }        if (minDeskNumber == 0) {//因为一开始设置的minDeskNumber值是0,此时要分两种情况,查询结果就是minDeskNumber=0或者查询不到特定的序号此时            if (list.get(minDeskNumber).getLeftPositions() >= totalPersons) {//对应第一种情况                Desk targetDesk = list.get(minDeskNumber);                int deskNumber = targetDesk.getDeskNumber();                int leftPositions = targetDesk.getLeftPositions() - totalPersons;                if(leftPositions>0)                    list.get(minDeskNumber).setLeftPositions(leftPositions);                else list.remove(minDeskNumber);                return "第" + deskNumber + "桌" + totalPersons + "位";            } else {                for (int i = 0; i < list.size(); i++) {//对应第二种情况,此时查找出拥有最大剩余座位的序号。例如:totalPersons为6,总共有三桌,1号桌剩余4,2号桌剩余3,3号桌剩余2,此时选择1号桌的4个位置,再递归调用此方法。                    Desk targetDesk = list.get(i);                    if (targetDesk.getDeskNumber() >= list.get(maxDeskNumber).getLeftPositions())                        maxDeskNumber = i;                }                Desk targetDesk = list.get(maxDeskNumber);                int deskNumber = targetDesk.getDeskNumber();                int leftPositions = targetDesk.getLeftPositions();                list.remove(maxDeskNumber);                return "第" + deskNumber + "桌" + leftPositions + "位" + (totalPersons - leftPositions  ==1 ? noFamilyMembers() : withFamilyMembers(totalPersons - leftPositions));//递归调用            }        } else {//此时查找出拥有最大剩余座位的序号。                Desk targetDesk = list.get(minDeskNumber);                int deskNumber = targetDesk.getDeskNumber();                int leftPositions = targetDesk.getLeftPositions() - totalPersons;            if(leftPositions>0)                list.get(minDeskNumber).setLeftPositions(leftPositions);            else list.remove(minDeskNumber);                return "第" + deskNumber + "桌" + totalPersons + "位";            }        }else            return "座位已满,请联系管理员";    }    public static String noFamilyMembers() {        int deskNumber;        int leftPositions;        Desk targetDesk = null;        if (onePositionDesk != null) {            targetDesk = onePositionDesk;            deskNumber = targetDesk.getDeskNumber();            for(int i=0;i<list.size();i++){                if(onePositionDesk.getDeskNumber()==list.get(i).getDeskNumber()){                    list.remove(list.get(i));                }            }            onePositionDesk = null;            return "第" + deskNumber + "桌" + 1 + "位";        } else {            if (list.size() > 0) {                Random random = new Random();                int i = random.nextInt(list.size());                targetDesk = list.get(i);                leftPositions = targetDesk.getLeftPositions() - 1;                if (leftPositions == 1) {//当某一桌的座位号剩下一个座位的时候,下次分配座位不随机选取,就选这一桌。                    onePositionDesk = targetDesk;                    deskNumber = targetDesk.getDeskNumber();                } else if (leftPositions == 0) {                    deskNumber = targetDesk.getDeskNumber();                    list.remove(i);                } else {                    targetDesk.setLeftPositions(leftPositions);                    deskNumber = targetDesk.getDeskNumber();                }                return "第" + deskNumber + "桌" + 1 + "位";            }            else return "座位已满,请联系管理员";        }    }}
逻辑应该挺简单的哈,里面用到了大学时学的递归。


0 0
原创粉丝点击