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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MPPT工作流程及算法和硬件的选择

MPPT算法选择 目前&#xff0c;MPPT算法有开路电压比率(离线)、短路电流比率(离线)、观察调节(在线)、极限追踪控制法(在线)。 在光伏控制系统中&#xff0c;因为日照、温度等条件的变化&#xff0c;光伏电池的输出功率也是在不断变化的&#xff0c;为保证使得光伏电池的输出功…

Python基础语法之学习运算符

Python基础语法之学习运算符 一、代码二、效果 一、代码 print("1 1 ", 1 1) print("1 - 1 ", 1 - 1) print("1 * 1 ", 1 * 1) print("11 / 5 ", 11 / 5) print("11 // 5 ", 11 // 5) print("9 % 5 ", 9…

【单调栈】最大二叉树

题目&#xff1a; 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums…

linux用户身份切换su和 sudo

su 切换root&#xff0c;但是&#xff0c;环境变量是之前用户的 可以看到利用su切换&#xff0c;根目录还是pro1的 su - 连同环境一起切换成root&#xff0c;切换后工作目录都不一样了&#xff0c;看输入内容左侧信息&#xff0c;和第一个图片比较 -c仅执行一次命令&#xff0…

INFINI Gateway 与华为鲲鹏完成产品兼容互认证

何为华为鲲鹏认证 华为鲲鹏认证是华为云围绕鲲鹏云服务&#xff08;含公有云、私有云、混合云、桌面云&#xff09;推出的一项合作伙伴计划&#xff0c;旨在为构建持续发展、合作共赢的鲲鹏生态圈&#xff0c;通过整合华为的技术、品牌资源&#xff0c;与合作伙伴共享商机和利…

脚本绑邦引流脚本拓客软件短视频获客直播间截流抖音快手小红书自动引流关注点赞私信评论截流涨粉

一、引流脚本是什么&#xff1f; 引流脚本是一种自动化的工具&#xff0c;可以帮助你在各​种短视频、​社交媒体平台上进行批量关注、点赞、私信、评论等操作&#xff0c;从而吸引更多的流量和粉丝。通过引流脚本&#xff0c;你可以自动化地执行各种操作&#xff0c;解放双手…

kafka如何保证消息不丢失 不重复消费 消息的顺序

如何保证消息的不丢失 消息为什么会丢失 想要保证消息不丢失就要首先知道消息为什么会丢失,在哪个环节会丢失,然后在丢失的环节做处理 1.生产者生产消息发送到broker,broker收到消息后会给生产者发送一个ack指令.生产者接收到broker发送成功的指令,这个时候我们就可以认为消息…

RPG项目01_UI登录

首先创建一个项目 将资源包导进Resources文件夹 创建一个Scripts脚本文件夹 然后再对Scripts脚本文件夹分门别类 导入UI资源包 创建一个Image 按住Alt 选择右下角 image就会覆盖整个面板 修改image名字为BG 将image图片放置背景栏 再创建一个image 改名为MainMenu 修改MainMenu…

Spring Boot 3.2.0 Tomcat虚拟线程初体验 (部分装配解析)

写在前面 spring boot 3 已经提供了对虚拟线程的支持。 虚拟线程和平台线程主要区别在于&#xff0c;虚拟线程在运行周期内不依赖操作系统线程&#xff1a;它们与硬件脱钩&#xff0c;因此被称为 “虚拟”。这种解耦是由 JVM 提供的抽象层赋予的。 虚拟线程的运行成本远低于平…

zblog插件-zblog采集插件下载

在当今数字化的时代&#xff0c;博客已经成为人们分享思想、经验和知识的重要平台。而对于使用zblog博客系统的用户来说&#xff0c;充实博客内容是提高用户体验和吸引读者的不二法门。然而&#xff0c;手动收集内容对于博主来说既费时又繁琐。在这个背景下&#xff0c;zblog插…

什么是数据填报?

数据填报是报表用以满足用户提出的灵活报送数据的需求&#xff0c;能快速开发各类数据采集系统的专业功能。多源填报模型&#xff0c;可实现数据的多源抽取与多源回填&#xff0c;在同一张填报表上实现数据提交至多个不同的数据表、数据库。 随着业务快速变化和扩大&#xff0c…

python基础练习题库实验5

文章目录 题目1代码实验结果题目2代码实验结果题目3代码实验结果![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6058fb4b66994aed838f920f7fe75706.png)题目4代码实验结果题目总结题目1 编写一个程序,使用while循环语句和字符串格式显示以下精确输出。 例如: …

【Spring集成MyBatis】MyBatis的多表查询

文章目录 1. 一对一什么是一对一User、Order类及Mapper&#xff0c;User、Order表一对一操作的实现一对一操作实现的第二种方式 2. 一对多什么是一对多一对多操作实现 3. 多对多什么是多对多多对多的实现 4. 小结 1. 一对一 什么是一对一 一对一指的是表与表之间通过外键进行…

使用C语言库函数qsort排序注意点

目录 题目背景错误C语言代码&#xff1a;正确C语言代码&#xff1a;注意点 题目背景 高校团委组织校园歌手比赛&#xff0c;进入决赛的校园歌手有10位,歌手编号从1到10进行编号。组委会随机抽取方式产生了决赛次序为&#xff1a;3,1,9,10,2,7,5,8,4,6。比赛现场有5个评委为参赛…

4、stable diffusion

github 安装anaconda环境 conda env create -f environment.yaml conda activate ldm安装依赖 conda install pytorch1.12.1 torchvision0.13.1 torchaudio0.12.1 cudatoolkit11.3 -c pytorch pip install transformers4.19.2 diffusers invisible-watermark pip install -e…

6、信息收集(1)

文章目录 一、DNS信息查询1、利用dig工具查询各类DNS的解析。2、使用DNS子域名爆破工具&#xff0c;针对子域名进行爆破&#xff0c;同时解析出对应的IP地址。3、利用多地Ping工具&#xff0c;查看域名真实IP。4、针对部分IP进行信息收集 二、DNS域传输实验原理方法一方法二 三…

C语言——数组转换

将的两行三列数组转换为三行两列的数组 #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int a[2][3]{{1,2,3},{4,5,6}};int b[3][2],i,j;for ( i 0; i <1; i){for ( j 0; j <2; j){printf("%5d",a[i][j]);b[j][i]a[i][j];}printf(&…

【FGPA】Verilog:JK 触发器 | D 触发器 | T 触发器 | D 触发器的实现

0x00 JK 触发器 JK 触发器是 RS 触发器和 T 触发器的组合&#xff0c;有两个输入端 J 和 K&#xff0c;如果两个输入端都等于 1&#xff0c;则将当前值反转。 行为表 状态图 Timing Diagram Circuit JK 触发器的设计目的是防止 RS 触发器在输入 S 和 R 均等于 …

fiddler设置过滤你就这样做,一做一个不只声!

fiddler设置过滤 基本的过滤操作流程以百度为例 步骤&#xff1a; 1、右侧高级工具栏点击Filters》勾选Use Filters》选择Show only Internet Hosts和Show only the following Hosts》在文本框中输入host地址 2、点击Changes not yet saved》再点击Actions》Run Filterset …

Vue3-toRaw 和 markRaw 函数

Vue3-toRaw 和 markRaw 函数 toRaw(转换为原始)&#xff1a;将响应式对象转换为普通对象&#xff0c;只适用于 reactive 生成的响应式对象。markRaw(标记为原始)&#xff1a;标记某个对象&#xff0c;让这个对象永远都不具备响应式。一些集成的第三方库&#xff0c;会有大量的…