高中生分科考试--座位编排系统

news2024/11/20 4:39:01

这个系统是帮我一同学的哥哥的做的座位编排系统,他是某个学校的教育从事者

基本需求:就是能够根据他提供的各个分科班级同学的成绩单来选择相同分科的考场编排(按成绩高低),同时输入相应的考场数,和每个考场的人数。如果某个分科的人数超过了规定的考场数与规定的考场人数的乘积,那么就会将人数均匀的分配到前几个考场;此外还有一种情况,如果分科后的人数对每个考场的人数取余后,不为0,那么就是要将余出来的人进行均匀分配,同样往前面几个考场依次插入。

效果展示:

提供的excel:

输出的excel:

这里用到了aly的easyexcel

直接上代码了:

package com.csh.student_places.gui;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.csh.student_places.entity.PlaceStudent;
import com.csh.student_places.entity.StudentInfo;
import org.springframework.beans.BeanUtils;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.security.SecureRandom;
import java.util.*;
import java.util.List;
import java.util.stream.Collectors;

public class MainView extends JFrame {

    public void mainview()
    {

        //主界面的进入
        JFrame jFrame = new JFrame("学生考场分配系统");//创建对象
        jFrame.setVisible(true);//窗口的可视化
        jFrame.setBounds(650, 150, 700, 400);//窗口的初始化
        jFrame.setResizable(false);
        Container container = jFrame.getContentPane();
        container.setBackground(Color.lightGray);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭事件
        container.setLayout(null);
        //初始化按钮信息
        JLabel jLabelr = new JLabel("学生考场分配系统By陈某宏");
        jLabelr.setFont(new Font("行书", Font.BOLD, 30));
        jLabelr.setForeground(Color.BLUE);
        jLabelr.setBounds(180, 250, 400, 100);
        container.add(jLabelr);
        JLabel label1 = new JLabel("输入学生基本信息Excel表的绝对路径:");
        JTextField inexcel = new JTextField();
        label1.setBounds(5,0,400,100);
        label1.setFont(new Font("行书", Font.BOLD, 20));
        inexcel.setBounds(360,35,500,30);
        JLabel inexcellable = new JLabel("考场数:");
        inexcellable.setBounds(5,30,100,100);
        inexcellable.setFont(new Font("行书", Font.BOLD, 20));
        JTextField numberplace = new JTextField();
        numberplace.setBounds(80,65,60,30);


        JLabel inexcellable1 = new JLabel("考场人数:");
        inexcellable1.setBounds(150,30,200,100);
        inexcellable1.setFont(new Font("行书", Font.BOLD, 20));
        JTextField numberperson = new JTextField();
        numberperson.setBounds(250,65,60,30);

        JLabel label2 = new JLabel("输出的学生考场信息Excel表的绝对路径:");
        JTextField outexcel = new JTextField();
        label2.setBounds(5,60,400,100);
        label2.setFont(new Font("行书", Font.BOLD, 20));
        outexcel.setBounds(380,95,500,30);

        JButton jButton = new JButton("生成");
        jButton.setBounds(250,200,200,30);

        container.add(jButton);
        container.add(label2);
        container.add(outexcel);
        container.add(inexcellable1);
        container.add(numberperson);
        container.add(numberplace);
        container.add(inexcellable);
        container.add(label1);
        container.add(inexcel);
        jFrame.update(jFrame.getGraphics());

        jButton.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //点击这个按钮之后开始读取
                String inexcelname = inexcel.getText();//取到输入表的路径
                String outexcelname = outexcel.getText();//输出表的路径
                String numberplace1 = numberplace.getText();//考场数
                String numberperson1 = numberperson.getText();//考场人数

                int n= Integer.parseInt(numberplace1);//考场数
                int m= Integer.parseInt(numberperson1);//考场人数

                String substring = inexcelname.substring(1);
                String substring1 = outexcelname.substring(1);


                ArrayList<StudentInfo> studentInfos = new ArrayList<>();

                EasyExcel.read(substring, StudentInfo.class, new AnalysisEventListener<StudentInfo>() {
                    // 每解析一行数据,该方法会被调用一次
                    @Override
                    public void invoke(StudentInfo studentInfo, AnalysisContext analysisContext) {
                        studentInfos.add(studentInfo);
                    }
                    // 全部解析完成被调用
                    @Override
                    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                        System.out.println("解析完成...");
                        // 可以将解析的数据保存到数据库
                    }
                }).sheet().doRead();
//                System.out.println(studentInfos.toString());//拿到了学生的所有数据

                //进行分组
                int size = studentInfos.size();//拿到了所有的人数
                Map<String, List<StudentInfo>> studentMap1 = studentInfos.stream().collect(Collectors.groupingBy(StudentInfo::getGroup));
//                System.out.println(studentMap.toString());
                List<Map.Entry<String, List<StudentInfo>>> list = new LinkedList<>(studentMap1.entrySet());

                Collections.sort(list, new Comparator<Map.Entry<String, List<StudentInfo>>>() {
                    public int compare(Map.Entry<String, List<StudentInfo>> o1, Map.Entry<String, List<StudentInfo>> o2) {
                        return o2.getKey().length() - o1.getKey().length();
                    }
                });

                
                Map<String, List<StudentInfo>> studentMap = new LinkedHashMap<>();
                for (Map.Entry<String, List<StudentInfo>> entry : list) {
                    studentMap.put(entry.getKey(), entry.getValue());
                }

                ArrayList<PlaceStudent> placeStudents = new ArrayList<>();//总的排考表
                int testplace=1;
                int lastplace=1;

                ArrayList<ArrayList<PlaceStudent>> all = new ArrayList<>();


                ArrayList<PlaceStudent> placeStudents1 = new ArrayList<>();


                //全到这个map里面了,每一个组合在一个map中,遍历整个map,取出每一个map
                for (Map.Entry<String, List<StudentInfo >> entry : studentMap.entrySet()) { //key是分组条件name
                    //通过key取value,value是Person对象,可能有多个,用list取
                    List<StudentInfo> list11 = (List<StudentInfo>) studentMap.get(entry.getKey());
//                    System.out.println(list11.toString());
//                    System.out.println("**********************************");

                    int size1 = list11.size();//取到每个组合的人数

                    System.out.println(size1);

                    //随机打乱顺序
//                    Random random = new SecureRandom();
//                    Collections.shuffle(list11, random);

//                    System.out.println(list11.toString());
//                    System.out.println("__________________________________________________________________________________");

                    for(StudentInfo s: list11)
                    {
                        if(s.getGrade()==null||!Character.isDigit(s.getGrade().charAt(0)))
                        {
                            s.setGrade("0");
                        }
                    }
                    list11.sort(new AgeComparator());
                    //判断余数
                    int lastperson = size1 % m;//剩的人
                    int i1 = size1 / m;//看这个组合需要多少考场,向下取整这里
                    //先排一下
                    if(lastperson>0)
                    {
                        i1++;
                    }
                    ArrayList<ArrayList<PlaceStudent>> arrayLists = new
                            ArrayList<>(i1);//这个组合的考场集合
                    for (int i = 0; i < i1; i++) {
                        arrayLists.add(new ArrayList<PlaceStudent>(2000)); // 向 arrayLists 中添加 i1 个空的 ArrayList<StudentInfo> 元素
                    }
                    int flag=0;
                    for (int i=0;i<i1;i++)
                    {
//                        ArrayList<StudentInfo> studentInfos1 = new ArrayList<>();//类比于当中的一个考场
                        for(int j=0;j<m;j++)
                        {
                            if(flag==size1)
                            {
                                //此时已全部取完

                                break;
                            }
                            PlaceStudent placeStudent = new PlaceStudent();
                            BeanUtils.copyProperties(list11.get(flag),placeStudent);
                            placeStudent.setPlace(testplace);//设置考场数
                            placeStudent.setSeatnumber(j+1);
                            if(testplace<10)
                            {
                                if(j<9)
                                {
                                    placeStudent.setTestid(list11.get(flag).getClass1()+"0"+testplace+"0"+(j+1));
                                }
                                else
                                {
                                    placeStudent.setTestid(list11.get(flag).getClass1()+"0"+testplace+(j+1));
                                }

                            }
                            else
                            {
                                if(j<9)
                                {
                                    placeStudent.setTestid(list11.get(flag).getClass1()+testplace+"0"+(j+1));
                                }
                                else
                                {
                                    placeStudent.setTestid(list11.get(flag).getClass1()+testplace+(j+1));
                                }
                            }
                            arrayLists.get(i).add(placeStudent);
                            flag++;//向下取
                        }
                        testplace++;
                    }
                    if(lastperson<=25&&lastperson!=0)
                    {
                        //此时将人往前面考场排,向下取整的考场数
                        int flag1=0;
                        ArrayList<PlaceStudent> laststudentInfos = arrayLists.get(i1 - 1);//n拿到的是最后一个教室要往前排的人
                        i1--;//减少一个考场
                        while(lastperson>0)//还有要排的人
                        {
                            for(int i=0;i<i1;i++)//往前加人,除去最后一个教室
                            {
                                if(lastperson>0)
                                {
                                    PlaceStudent placeStudent = laststudentInfos.get(flag1);
                                    placeStudent.setPlace(lastplace+i);
                                    placeStudent.setSeatnumber(arrayLists.get(i).size()+1);
                                    //学生考号
                                    if(lastplace+i<10)
                                    {
                                        placeStudent.setTestid(placeStudent.getClass1()+"0"+(lastplace+i)+placeStudent.getSeatnumber());
                                    }
                                    else
                                    {
                                        placeStudent.setTestid(placeStudent.getClass1()+(lastplace+i)+placeStudent.getSeatnumber());
                                    }
                                    arrayLists.get(i).add(placeStudent);
                                    flag1++;
                                    lastperson--;
                                }
                                else
                                {
                                    testplace--;
                                    break;
                                }
                            }
                        }
                    }
                    else{
                       //此时不需要往前塞人了
                        //这个考场已经排满

                    }
                    //再合并起来
                    ArrayList<PlaceStudent> studentInfos1 = new ArrayList<>();
                    for(int i=0;i<i1;i++)
                    {
                        studentInfos1.addAll(arrayLists.get(i));
                    }
//                    System.out.println(studentInfos1.toString());
                    lastplace=testplace;
                    all.add(studentInfos1);
                    placeStudents1.addAll(studentInfos1);
                }
                System.out.println(placeStudents1.toString());
                System.out.println(all.toString());


                System.out.println(substring1);
                EasyExcel.write(substring1, PlaceStudent.class)
                        .sheet("2")
                        .doWrite(placeStudents1);


            }
        });

    }


}
class AgeComparator implements Comparator<StudentInfo> {
    public int compare(StudentInfo p1, StudentInfo p2) {
        return p2.getGrade().compareTo(p1.getGrade());
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1263682.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法萌新闯力扣】:旋转链表

力扣题目&#xff1a;旋转链表 开篇 今天是备战蓝桥杯的第25天和算法村开营第3天&#xff01;经过这3天的学习&#xff0c;感觉自己对链表的掌握程度大大地提升&#xff0c;尤其是在帮村里的同学讨论相关问题时。本篇文章&#xff0c;给大家带来一道旋转链表的题目&#xff0c…

【VROC】看Intel VROC如何给NVMe SSD做RAID

在当今对硬盘性能要求越来越高的环境中&#xff0c;SATA和SAS接口由于自身的限制&#xff0c;其性能很难突破600MiB/s的瓶颈。因此&#xff0c;对于需要更高底层硬件性能的行业&#xff0c;如数据库等&#xff0c;对NVMe盘的需求越来越迫切。然而&#xff0c;NVMe盘直通到CPU&a…

2005-2022年全球各国经济距离数据

2005-2022年全球各国经济制度距离数据 1、时间&#xff1a;2005-2022年 2、指标&#xff1a;国家、年份、经济距离1&#xff08;根据美国传统基金会世界经济自由度指数整理&#xff09;、经济距离2&#xff08;参考(Kogut&Singh,1988)构建经济制度距离&#xff09; 3、范…

dst-admin饥荒管理后台 RCE漏洞复现(CVE-2023-0646、CVE-2023-0647、CVE-2023-0649)

0x01 产品简介 dst-admin饥荒管理后台是qinming99个人开发者的一个用 Java 语言编写的 web 程序。 0x02 漏洞概述 dst-admin饥荒管理后台kickPlayer、cavesConsole、sendBroadcast等接口处配置不当&#xff0c;导致破解口令后的攻击者可以进行命令注入&#xff0c;获取服务器权…

第五节HarmonyOS ArkTS声明式开发范式

ArkTS声明式开发范式&#xff1a; 规范中各个内容说明如下&#xff1a; 装饰器 1、基本UI装饰器Entry、Component Entry 装饰struct&#xff0c;页面的入口。 Component 装饰struct&#xff0c;表示该struct具有基于组件的能力。 2、数据装饰器State、Prop、Link State…

【ShardingSphere专题】SpringBoot整合ShardingSphere(一、数据分片入门及实验)

目录 前言阅读对象笔记正文一、ShardingSphere介绍1.1 ShardingSphere-JDBC&#xff1a;代码级别1.2 ShardingSphere-Proxy&#xff1a;应用级别1.3 横向对比图 二、ShardingSphere之——数据分片2.1 基本介绍2.2 分片的形式2.2.1 垂直分片2.2.2 水平分片 2.3 数据分片核心概念…

Python实现性能自动化测试

一、思考❓❔ 1.什么是性能自动化测试? 性能 系统负载能力超负荷运行下的稳定性系统瓶颈自动化测试 使用程序代替手工提升测试效率性能自动化 使用代码模拟大批量用户让用户并发请求多页面多用户并发请求采集参数&#xff0c;统计系统负载能力生成报告 2.Python中的性能自动…

代码随想录算法训练营 ---第四十九天

前言&#xff1a; 今天是买卖股票的最佳时机系列&#xff0c;本系列之前在学习贪心思想时做过一些。 第一题&#xff1a; 简介&#xff1a; 本题在读题时我们要注意到几个细节 1.本题股票买卖只有一次。2.我们要在最低点买股票&#xff0c;在最高点卖股票。 我的思路&#…

基于Java SSM框架+Vue实现药品保健品购物网站项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架Vue实现药品保健品购物网站演示 摘要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 ssm药源购物网站&#xff0c;主要的模块包括两个用户&#xff0c;管理员权限&#xff1a;用…

C++初阶--String类的使用

string类 在C语言中&#xff0c;我们总是用char* 的类型来创建一个变量&#xff0c;存储一个字符串&#xff1b;当我们想对它进行修改或者读写时&#xff0c;需要自我创建空间和使用string.h的库函数来进行操作它&#xff1b; 而在C中&#xff0c;C专门提供了一个头文件 stri…

揭秘论文开题报告写作技巧,全程无忧,附赠技术路线图模板!

最近不少学校开始让准毕业生撰写论文开题报告&#xff0c;如果是第一次接触学术论文的朋友&#xff0c;多少会卡在概念的理解上&#xff0c;就像题主说到的&#xff0c;开题报告中包含的各个部分&#xff0c;如研究目的、研究目标、研究内容等&#xff0c;容易让人眼花缭乱。 …

ChatGPT到底是如何运作?

自从2022年11月30日发布以来&#xff0c;ChatGPT一直占据着科技届的头条位置&#xff0c;随着苹果的创新能力下降&#xff0c;ChatGPT不断给大家带来震撼&#xff0c;2023年11月7日&#xff0c;首届OpenAI开发者大会在洛杉矶举行&#xff0c;业界普遍认为&#xff0c;OpenAI的开…

2021年12月 Scratch图形化(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共15题,每题2分,共30分) 第1题 下图两个积木的值分别是? A:false true B:false false C:true true D:true false 答案:A 第2题 小猫和小狗是非常好的朋友,他们发明了一种加密方法:用两位数字代表字母。…

【Linux进阶之路】进程间通信

文章目录 一、原理二、方式1.管道1.1匿名管道1.1.1通信原理1.1.2接口使用 1.2命名管道 2.共享内存2.1原理2.2接口使用 3.消息队列原理 4.信号量引入原理 总结 一、原理 进程间的通信是什么&#xff1f;解释&#xff1a; 简单理解就是&#xff0c;不同进程之间进行数据的输入输出…

python之pyqt专栏7-信号与槽3

在上一篇文章中python之pyqt专栏6-信号与槽2-CSDN博客中&#xff0c;我们可以了解到对象可以使用内置信号&#xff0c;这些信号来自于类定义或者继承过来的。我们可以对这些信号可以通过connect连接槽函数。 需求 现在有一个需求&#xff0c;有两个UI界面“untitled.ui”和“u…

微信小程序开发——项目开发入门

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 概述 本文重点介绍微信小程序开发者工具的下载与安装与项目开发入门。 下载开发者工具 请在官方网站下载微信小程序开发工具&#xff1b;图示如下&#xff1a; 请依据实际…

基于mvc的大学生家教信息网站系统php+vue

运行环境:phpstudy/wamp/xammp等 开发语言&#xff1a;php 后端框架&#xff1a;Thinkphp5 前端框架&#xff1a;vue.js 服务器&#xff1a;apache 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat/phpmyadmin 开发软件&#xff1a;hbuilderx/vscode/Dreamweaver/PhpSt…

[SaaS] 淘宝AI淘淘秀

AIGC技术在淘淘秀场景的探索与实践关键词&#xff1a;图像类AI创新应用、用户轻松创作、内容分享、结合商家品牌。https://mp.weixin.qq.com/s/-3a3_nKeKGON-9-Prd7JKQ 1.生成模版 利用定制的prompt&#xff0c;生成一些比较好的素材图片案例。 最终的用的是通义万相。 2.仿…

不会代码也能拿高薪?掌握面试法宝,轻松10000+

快速排序&#xff08;Quicksort&#xff09;是对冒泡排序的一种改进。 快速排序由 C.A.R.Hoare 在 1962 年提出。 它的基本思想是&#xff1a;通过一趟排序将要排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据都比另外一部分的所有数据都要小&#xff0c;然后…

基于springBoot+mysql实现的竞赛管理系统

基于springBootmysql实现的竞赛管理系统&#xff0c;演示地址:系统登录 - 软件学院比赛管理系统 管理员账号&#xff1a;1&#xff0c;密码:1 包括比赛管理&#xff0c;队伍管理&#xff0c;教师管理&#xff0c;经费管理&#xff0c;学生管理&#xff0c;比赛结果&#xff0c;…