讲师中心 微信公众号
AI工具推荐 视频效率加速

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

风强大大_5537

风强大大_5537

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

|

581人浏览过

|

来源于php中文网

原创

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

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

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

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

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

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

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

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

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

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

Miller CSV TSV JSON 数据处理器
Miller CSV TSV JSON 数据处理器

Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。

下载
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 点,比较就失效。

正确方式是用 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 字段内容不可控——你永远不知道教务系统导出的姓名里有没有隐藏的全角逗号或零宽空格。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

相关专题

更多
eclipse教程
eclipse教程

php中文网为大家带来eclipse教程合集,eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。php中文网还为大家带来eclipse的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

550

2023.06.14

eclipse怎么设置中文
eclipse怎么设置中文

eclipse设置中文的方法:除了设置界面为中文外,你还可以为Eclipse添加中文插件,以便更好地支持中文编程。例如,你可以安装EBNF插件来支持中文变量名,或安装Chinese Helper来提供中文帮助文档。本专题为大家提供eclipse设置中文相关的各种文章、以及下载和课程。

4526

2023.07.24

c语言编程软件有哪些
c语言编程软件有哪些

c语言编程软件有GCC、Clang、Microsoft Visual Studio、Eclipse、NetBeans、Dev-C++、Code::Blocks、KDevelop、Sublime Text和Atom。更多关于c语言编程软件的问题详情请看本专题的文章。php中文网欢迎大家前来学习。

6819

2023.11.02

Eclipse版本号有哪些区别
Eclipse版本号有哪些区别

区别:1、Eclipse 3.x系列:Eclipse的早期版本,包括3.0、3.1、3.2等;2、Eclipse 4.x系列:Eclipse的最新版本,包括4.0、4.1、4.2等;3、Eclipse IDE for Java Developers等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2584

2024.02.23

eclipse和idea有什么区别
eclipse和idea有什么区别

eclipse和idea的区别:1、平台支持;2、内存占用;3、插件系统;4、智能代码提示;5、界面设计;6、调试功能;7、学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

622

2024.02.23

eclipse设置中文全教程
eclipse设置中文全教程

本专题整合了eclipse设置中文相关教程,阅读专题下面的文章了解更多详细操作。

2906

2025.10.10

eclipse字体放大教程
eclipse字体放大教程

本专题整合了eclipse字体放大教程,阅读专题下面的文章了解更多详细内容。

2925

2025.10.10

eclipse左边栏不见了解决方法
eclipse左边栏不见了解决方法

本专题整合了eclipse左边栏相关教程,阅读专题下面的文章了解更多详细内容。

388

2025.10.15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

0

2026.09.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn