在Java里如何实现课程信息管理程序_Java集合操作项目说明

ArrayList比数组更实用,因能自动扩容、避免类型错误;Course需含id/name/credit字段并重写toString();查重须trim()后equals();排序用Comparator避免溢出;文件保存需UTF-8编码遍历格式化。

ArrayList 存课程对象比数组更实用

硬编码数组长度容易出错,增删课程时还得手动搬数据。ArrayList 能自动扩容,配合泛型还能避免类型转换错误。别用 ArrayList 或裸类型,否则编译期就失去约束。

  • Course 类至少要有 idnamecredit 三个字段,建议加 toString() 方便调试
  • 初始化时用 new ArrayList(),别写成 new ArrayList()(会触发原始类型警告)
  • 删除课程别用 for (int i = 0; i 配合 remove(i) —— 索引会偏移,漏删或越界

按课程名查重必须用 equals(),不是 ==

学生可能输“数据结构”和“数据结构 ”(尾部空格),直接 == 比较字符串永远返回 false。哪怕只查 name 字段,也要先 trim()equals()

public boolean existsByName(String name) {
    String target = name == null ? "" : name.trim();
    for (Course c : courses) {
        if (target.equals(c.getName().trim())) {
            return true;
        }
    }
    return false;
}
  • 如果查重逻辑变复杂(比如忽略大小写),改用 equalsIgnoreCase()
  • 别在循环里反复调用 courses.get(i).getName().trim(),提前存局部变量
  • Stream 写法虽简洁,但初学者容易写出 list.stream().filter(...).findFirst().isPresent() 这种低效写法——它会遍历全部元素

按学分排序要实现 Comparable 或传 Comparator

Collections.sort(courses) 不会自动按学分排,除非 Course 实现了 Comparable 并在 compareTo() 里比较 credit。更灵活的做法是临时传 Comparator

Collections.sort(courses, (c1, c2) -> Integer.compa

re(c1.getCredit(), c2.getCredit()));
  • 升序用 Integer.compare(a, b),降序用 Integer.compare(b, a),别直接写 a - b(整数溢出风险)
  • 如果排序字段可能为 null(比如未录入学分),用 Comparator.nullsLast(Comparator.naturalOrder())
  • 排序后原 ArrayList 被修改,不需要额外赋值回变量

保存到文件时别用 PrintWriter.println(list)

直接打印整个 ArrayList 只会输出类似 [com.example.Course@1a2b3c4d, ...],毫无可读性。得遍历每个 Course,拼成 CSV 或 JSON 格式再写入。

  • 简单场景用 CSV:每行 id,name,credit,字段间用英文逗号,name 含逗号时需加双引号并转义
  • 别用 FileWriter 而不指定编码,中文会变乱码;显式传 StandardCharsets.UTF_8
  • try-with-resources 包裹 BufferedWriter,否则程序异常退出时文件可能为空或损坏

实际跑起来最常卡在查重逻辑和文件编码上,尤其是 Windows 下默认 ANSI 编码和 IDE 用 UTF-8 的冲突。先确保控制台能正确打印中文,再动文件读写。