0

0

在Java中实现学生签到系统_Java文件与集合项目说明

P粉602998670

P粉602998670

发布时间:2025-12-31 17:27:09

|

541人浏览过

|

来源于php中文网

原创

签到记录用ArrayList按时间追加,但“某学生今日是否签到”查询必须用HashMap或HashSet加速;否则O(n)遍历在500人以上明显卡顿。

在java中实现学生签到系统_java文件与集合项目说明

学生签到系统用 ArrayList 还是 HashMap 存储更合适

直接说结论:签到记录本身用 ArrayList 按时间顺序追加,但查“某学生今天是否签到”必须靠 HashMapHashSet 加速——否则每次都要遍历整个列表,O(n) 查询在 500 人以上就明显卡顿。

常见错误是只用一个 ArrayList 存所有记录,然后写 for (SignRecord r : records) if (r.getStudentId().equals(id) && isToday(r.getTime())) ...,上线后老师点“查看未签到名单”要等三秒。

  • SignRecord 类至少包含 studentIdString)、timeLocalDateTime)、status(如 "PRESENT" / "LATE"
  • 每日签到单独建一个 HashMap,key 是学号,value 是该生今日最新签到记录(支持补签覆盖)
  • 历史数据仍可存进 ArrayList 做归档,但实时查询不碰它

读写学生名单文件时怎么避免 FileNotFoundException 和乱码

Java 默认用平台编码读文件,Windows 上是 GBK,Linux/macOS 是 UTF-8,而学生名单 CSV 几乎全是 UTF-8 且带中文。不显式指定编码,new Scanner(new File("students.csv")) 在不同机器上会读成一堆问号或抛异常。

正确做法是统一用 Files.newBufferedReader 并强制指定 StandardCharsets.UTF_8

立即学习Java免费学习笔记(深入)”;

try (BufferedReader reader = Files.newBufferedReader(Paths.get("students.csv"), StandardCharsets.UTF_8)) {
    String line;
    while ((line = reader.readLine()) != null) {
        String[] parts = line.split(",");
        if (parts.length >= 2) {
            students.add(new Student(parts[0].trim(), parts[1].trim()));
        }
    }
}
  • 别用 FileReader —— 它没有编码参数,永远走默认编码
  • CSV 文件首行如果是表头(如 id,name,grade),记得 reader.readLine() 先调一次跳过
  • 路径写相对路径时,确认当前工作目录是项目根目录(IntelliJ 默认是,Eclipse 可能是 bin/ 目录,建议用 getClass().getResource("/students.csv") 更稳

签到时间判断为什么不能直接用 new Date() 比较

因为 new Date() 返回的是带毫秒精度的绝对时间,而“今天”是个日期概念。直接 record.getTime().getDate() == new Date().getDate() 会失败——Date.getDate() 是月份中的日(1–31),但已弃用,且忽略年月;更糟的是,如果签到时间是 2024-05-20T23:59:59,服务器本地时间刚过 0 点,比较就失效。

知了追踪
知了追踪

AI智能信息助手,智能追踪你的兴趣资讯

下载

正确方式是用 LocalDate 做截断比较:

LocalDate today = LocalDate.now();
LocalDate recordDate = record.getTime().toLocalDateTime().toLocalDate();
boolean isToday = today.equals(recordDate);
  • 不要用 SimpleDateFormat 解析再比字符串——慢且线程不安全
  • 如果签到时间存的是 String(如 "2024-05-20 08:23:15"),解析时务必捕获 DateTimeParseException
  • 考虑时区:服务器部署在海外机房?用 LocalDate.now(ZoneId.of("Asia/Shanghai")) 显式指定

导出未签到学生名单到 CSV 时换行和逗号怎么处理

学生姓名里有逗号(如 “张三,男”)或换行符(如备注栏含 \n),直接 String.join(",", fields) 会导致 CSV 格式错乱,Excel 打开后列偏移、行断裂。

必须按 RFC 4180 规范:字段含逗号、换行或双引号时,整个字段用双引号包裹,且内部双引号转义为两个双引号:

public static String escapeCsvField(String field) {
    if (field == null) return "";
    if (field.contains(",") || field.contains("\n") || field.contains("\"")) {
        return "\"" + field.replace("\"", "\"\"") + "\"";
    }
    return field;
}

// 使用示例:
String line = String.join(",", 
    escapeCsvField(student.getId()),
    escapeCsvField(student.getName()),
    escapeCsvField("未签到")
);
  • 别自己写正则替换双引号——replace("\"", "\"\"") 就够,replaceAll 反而容易误伤
  • 导出大名单(>1000 行)时,用 BufferedWriter 而非拼接字符串,避免 OOM
  • 文件名建议带日期,如 "absent_20240520.csv",方便老师归档

真正麻烦的不是功能实现,而是 CSV 字段内容不可控——你永远不知道教务系统导出的姓名里有没有隐藏的全角逗号或零宽空格。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

805

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

724

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

727

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

395

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

445

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

428

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16861

2023.08.03

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.3万人学习

Git 教程
Git 教程

共21课时 | 2.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号