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

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

基本需求:就是能够根据他提供的各个分科班级同学的成绩单来选择相同分科的考场编排(按成绩高低),同时输入相应的考场数,和每个考场的人数。如果某个分科的人数超过了规定的考场数与规定的考场人数的乘积,那么就会将人数均匀的分配到前几个考场;此外还有一种情况,如果分科后的人数对每个考场的人数取余后,不为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() {@Overridepublic 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>() {// 每解析一行数据,该方法会被调用一次@Overridepublic void invoke(StudentInfo studentInfo, AnalysisContext analysisContext) {studentInfos.add(studentInfo);}// 全部解析完成被调用@Overridepublic 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,取出每一个mapfor (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 = newArrayList<>(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.mzph.cn/news/178857.shtml

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

相关文章

解决git action发布报错:Input required and not supplied: upload_url

现象&#xff1a; 这个问题死活都找不到原因&#xff0c;后来打了一段调试的代码 - name: Debug Create Release Output run: | echo "Release ID: ${{ env.RELEASE_ID }}" echo "Release Upload URL: ${{ env.RELEASE_UPLOAD_URL }}" env: RELEASE_ID: ${…

docker镜像原理

什么是镜像 容器解决应用开发、测试和部署的问题&#xff0c;而镜像解决应用部署环境问题。镜像是一个只读的容器模板&#xff0c; 打包了应用程序和应用程序所依赖的文件系统以及启动容器的配置文件&#xff0c;是启动容器的基础。镜像所打 包的文件内容就是容器的系统运行环…

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

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

028 - STM32学习笔记 - ADC(二) 独立模式单通道中断采集

028 - STM32学习笔记 - 结构体学习&#xff08;二&#xff09; 上节对ADC基础知识进行了学习&#xff0c;这节在了解一下ADC相关的结构体。 一、ADC初始化结构体 在标准库函数中基本上对于外设都有一个初始化结构体xx_InitTypeDef&#xff08;其中xx为外设名&#xff0c;例如…

智能优化算法应用:基于阴阳对算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于阴阳对算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于阴阳对算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.阴阳对算法4.实验参数设定5.算法结果6.参考文献7.…

《2023全球隐私计算报告》正式发布!

2023全球隐私计算报告 1、2023全球隐私计算图谱2、国内外隐私计算相关政策3、隐私计算技术的最新发展4、隐私计算技术的合规挑战5、隐私计算的应用市场动态6、隐私计算开源整体趋势7、隐私计算的未来趋势 11月23日&#xff0c;由浙江省人民政府、商务部共同主办&#xff0c;杭州…

智慧化工~工厂设备检修和保全信息化智能化机制流程

化工厂每年需要现场检修很多机器&#xff0c;比如泵、压缩机、管道、塔等等&#xff0c;现场检查人员都是使用照相机&#xff0c;现场拍完很多机器后&#xff0c;回办公室整理乱糟糟的照片&#xff0c;但是经常照了之后无法分辨是哪台设备&#xff0c;而且现场经常漏拍&#xf…

淘宝平台商品详情平台订单接入说明

一 文档说明 本文档面向对象为电商平台商品详情数据和订单进行管理的第三方开发者或自研商家 二 支持范围 目前API已经支持订单的接单、取消、退单处理等操作。如果您的订单管理需求现有API不能满足&#xff0c;可以联系我们提出API需求。 参数说明 通用参数说明 参数不要乱…

振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(8)

注解目录 1、znFAT 的起源 1.1 源于论坛 &#xff08;那是一个论坛文化兴盛的年代。网友 DIY SDMP3 播放器激起了我的兴趣。&#xff09; 1.2 硬盘 MP3 推了我一把 &#xff08;“坤哥”的硬盘 MP3 播放器&#xff0c;让我深陷 FAT 文件系统不能自拔。&#xff09; 1.3 我…

【数据结构】八大排序(二)

目录 前言&#xff1a; 冒泡排序 冒泡排序代码实现 冒泡排序特性总结 快速排序 单趟排序hoare版本 单趟排序挖坑法 单趟排序快慢指针法 快速排序整体概览 快排的优化 三数取中法选key 小区间优化 前言&#xff1a; 上文介绍了直接插入排序&#xff0c;希尔排序&…

vue3怎么提升效率的?为什么vue3比vue2快?效率提升主要在哪些方面?

官方文档中说vue3在 客户端渲染效率比vue2提升了1.3~2倍&#xff0c; SSR渲染效率比vue2提升了2~3倍&#xff0c;那么究竟是怎么提升的呢&#xff1f; 一、静态提升 在 vue3项目中的package.json文件中&#xff0c;可以看到这个 vue/compiler-sfc&#xff0c;它是用来解析(.v…

【Java Spring】SpringBoot常用插件

文章目录 1、Lombok1.1 IDEA社区版安装Lombok1.2 IDEA专业版安装Lombok1.3 Lombok的基本使用 2、EditStarters2.1 IDEA安装EditStarters2.2 EditStarters基本使用方法 1、Lombok 是简化Java开发的一个必要工具&#xff0c;lombok的原理是编译过程中将lombok的注解给去掉并翻译…

电力感知边缘计算技术网关产品设计方案-硬件方案

网关硬件架构设计图: 1.配置方案 配置差异 A类网关 B类网关 CPU

写一个宏,交换整数二进制位的奇数位和偶数位,并打印这个新的数

我们已经学过了C语言的宏&#xff0c;我们今天应用宏来交换一个整数的二进制的奇数位和偶数位&#xff0c;并得到这个被交换过的数&#xff0c;我们开始吧&#xff01; 1.问题分析 解题方法&#xff1a;& 和<< 和>>操作符 问题解析&#xff1a;我们这里假设一个…

这才是BI大数据分析工具的正确打开方式!

这两年经济下行给各行各业造成不小的发展困扰&#xff0c;为此企业积极自救&#xff0c;希望通过数字化降本增效&#xff0c;提高业绩水平。BI大数据分析工具就是企业数字化转型中常用到的一种商业智能BI工具&#xff0c;主要作用是缩短数据分析时间&#xff0c;提升企业数据分…

解析直播第三方美颜SDK:技术原理与应用

时下&#xff0c;直播平台和主播们纷纷引入美颜技术&#xff0c;以提升视觉效果和用户体验。而在众多美颜技术中&#xff0c;直播第三方美颜SDK成为许多开发者和平台的首选&#xff0c;因其灵活性和高效性而备受推崇。 一、技术原理&#xff1a;美颜算法的精髓 第三方美颜SDK…

2023年【A特种设备相关管理(锅炉压力容器压力管道)】新版试题及A特种设备相关管理(锅炉压力容器压力管道)模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年【A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;】新版试题及A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;模拟考试题库&#xff0c;包含A特种设备相关管理&#xff08;锅…

基于Python+OpenCV+dlib+Tensorflow深度学习的人脸表情识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 人脸表情识别是一种重要的计算机视觉任务&#xff0c;它涉及到对人脸图像中的表情进行分类和理解。在这个系统中&am…

vue使用echarts中国地图

需求&#xff1a;Vue3 vite TS 项目内使用 Echarts 5 绘制中国地图。鼠标悬浮省份上面显示指定的数据&#xff0c;地图支持缩放和拖拽的功能&#xff0c;页面放大缩小支持自适应&#xff0c;window.addEventListener(‘resize’, resize); 添加防抖动函数debounce。 一、安装…

零基础学Python第三天||写一个简单的程序

通过对四则运算的学习&#xff0c;已经初步接触了Python中内容&#xff0c;如果看官是零基础的学习者&#xff0c;可能有点迷惑了。难道敲几个命令&#xff0c;然后看到结果&#xff0c;就算编程了&#xff1f;这也不是那些能够自动运行的程序呀&#xff1f; 的确。到目前为止…