Java学生管理系统:设计、实现与功能扩展详细解析

一、需求分析

学生管理系统是一个常见的应用场景,用于管理学生的基本信息。本系统需要实现以下功能:

  1. 添加学生信息:用户可以输入学生的姓名、年龄、性别和学号等信息,将其添加到系统中。
  2. 删除学生信息:用户可以通过学号来删除指定的学生信息。
  3. 查询学生信息:用户可以通过学号或姓名来查询学生信息,系统会显示该学生的详细信息。
  4. 修改学生信息:用户可以通过学号找到学生信息并修改其姓名、年龄或性别。
  5. 学生信息排序:用户可以选择按照学号、姓名或年龄对学生信息进行排序。
  6. 学生信息统计:用户可以统计学生总数、男女生人数等。
  7. 批量导入学生信息:用户可以通过文件批量导入学生信息。
  8. 数据持久化:学生信息需要存储到文件中,下次启动程序时能够从文件中加载学生信息。

为了实现这些功能,我们需要设计一个合适的数据结构来存储学生信息,并提供相应的操作接口。

二、系统设计

(一)类的设计

  1. Student类

    • 属性
      • id(学号):唯一标识一个学生。
      • name(姓名):学生的姓名。
      • age(年龄):学生的年龄。
      • gender(性别):学生的性别。
    • 方法
      • 构造方法:用于创建学生对象时初始化属性。
      • toString():重写该方法,用于返回学生信息的字符串表示。
  2. StudentManager类

    • 属性
      • students:一个ArrayList<Student>,用于存储学生信息。
    • 方法
      • addStudent(Student student):添加学生信息。
      • deleteStudent(String id):根据学号删除学生信息。
      • queryStudentById(String id):根据学号查询学生信息。
      • queryStudentByName(String name):根据姓名查询学生信息。
      • modifyStudent(String id):根据学号修改学生信息。
      • sortStudentsById():按学号对学生信息进行排序。
      • sortStudentsByName():按姓名对学生信息进行排序。
      • sortStudentsByAge():按年龄对学生信息进行排序。
      • countStudents():统计学生总数、男女生人数。
      • importStudents(String filePath):从文件批量导入学生信息。
      • saveStudents():将学生信息保存到文件。
      • loadStudents():从文件加载学生信息。
  3. Main类

    • 提供一个菜单界面,让用户选择操作(添加、删除、查询、修改、排序、统计、批量导入学生信息)。
    • 根据用户的选择调用StudentManager类中的相应方法。

(二)数据结构设计

  • 使用ArrayList<Student>来存储学生信息。ArrayList是一个动态数组,可以方便地添加、删除和查询元素。

(三)交互设计

  • 使用控制台输入和输出。通过Scanner类获取用户输入,通过System.out打印系统提示和查询结果。

三、代码实现

(一)Student类

public class Student {
    private String id; // 学号
    private String name; // 姓名
    private int age; // 年龄
    private String gender; // 性别

    // 构造方法
    public Student(String id, String name, int age, String gender) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    // Getter 和 Setter 方法
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    // 重写 toString 方法
    @Override
    public String toString() {
        return "Student{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
}

(二)StudentManager类

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class StudentManager {
    private List<Student> students; // 存储学生信息的列表
    private static final String FILE_PATH = "students.txt"; // 学生信息文件路径

    // 构造方法
    public StudentManager() {
        students = new ArrayList<>();
        loadStudents(); // 加载学生信息
    }

    // 添加学生信息
    public void addStudent(Student student) {
        students.add(student);
        System.out.println("学生信息添加成功!");
        saveStudents(); // 保存学生信息
    }

    // 根据学号删除学生信息
    public void deleteStudent(String id) {
        for (Student student : students) {
            if (student.getId().equals(id)) {
                students.remove(student);
                System.out.println("学生信息删除成功!");
                saveStudents(); // 保存学生信息
                return;
            }
        }
        System.out.println("未找到该学号的学生!");
    }

    // 根据学号查询学生信息
    public void queryStudentById(String id) {
        for (Student student : students) {
            if (student.getId().equals(id)) {
                System.out.println(student);
                return;
            }
        }
        System.out.println("未找到该学号的学生!");
    }

    // 根据姓名查询学生信息
    public void queryStudentByName(String name) {
        boolean found = false;
        for (Student student : students) {
            if (student.getName().equals(name)) {
                System.out.println(student);
                found = true;
            }
        }
        if (!found) {
            System.out.println("未找到该姓名的学生!");
        }
    }

    // 修改学生信息
    public void modifyStudent(String id) {
        for (Student student : students) {
            if (student.getId().equals(id)) {
                Scanner scanner = new Scanner(System.in);
                System.out.print("请输入新的学生姓名(当前:" + student.getName() + "):");
                String newName = scanner.nextLine();
                if (!newName.isEmpty()) {
                    student.setName(newName);
                }
                System.out.print("请输入新的学生年龄(当前:" + student.getAge() + "):");
                String ageInput = scanner.nextLine();
                if (!ageInput.isEmpty()) {
                    student.setAge(Integer.parseInt(ageInput));
                }
                System.out.print("请输入新的学生性别(当前:" + student.getGender() + "):");
                String newGender = scanner.nextLine();
                if (!newGender.isEmpty()) {
                    student.setGender(newGender);
                }
                System.out.println("学生信息修改成功!");
                saveStudents(); // 保存学生信息
                return;
            }
        }
        System.out.println("未找到该学号的学生!");
    }

    // 按学号排序
    public void sortStudentsById() {
        students.sort(Comparator.comparing(Student::getId));
        System.out.println("学生信息已按学号排序!");
    }

    // 按姓名排序
    public void sortStudentsByName() {
        students.sort(Comparator.comparing(Student::getName));
        System.out.println("学生信息已按姓名排序!");
    }

    // 按年龄排序
    public void sortStudentsByAge() {
        students.sort(Comparator.comparingInt(Student::getAge));
        System.out.println("学生信息已按年龄排序!");
    }

    // 统计学生信息
    public void countStudents() {
        int total = students.size();
        int maleCount = 0;
        int femaleCount = 0;
        for (Student student : students) {
            if ("男".equals(student.getGender())) {
                maleCount++;
            } else if ("女".equals(student.getGender())) {
                femaleCount++;
            }
        }
        System.out.println("学生总数:" + total);
        System.out.println("男生人数:" + maleCount);
        System.out.println("女生人数:" + femaleCount);
    }

    // 批量导入学生信息
    public void importStudents(String filePath) {
        try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = reader.readLine()) != null) {
                String[] data = line.split(",");
                if (data.length == 4) {
                    Student student = new Student(data[0], data[1], Integer.parseInt(data[2]), data[3]);
                    students.add(student);
                }
            }
            System.out.println("学生信息批量导入成功!");
            saveStudents(); // 保存学生信息
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("文件导入失败!");
        }
    }

    // 保存学生信息到文件
    private void saveStudents() {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(FILE_PATH))) {
            for (Student student : students) {
                writer.write(student.getId() + "," + student.getName() + "," + student.getAge() + "," + student.getGender());
                writer.newLine();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 从文件加载学生信息
    private void loadStudents() {
        try (BufferedReader reader = new BufferedReader(new FileReader(FILE_PATH))) {
            String line;
            while ((line = reader.readLine()) != null) {
                String[] data = line.split(",");
                Student student = new Student(data[0], data[1], Integer.parseInt(data[2]), data[3]);
                students.add(student);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

(三)Main类

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        StudentManager manager = new StudentManager(); // 创建学生管理对象
        Scanner scanner = new Scanner(System.in); // 创建扫描器对象

        while (true) {
            System.out.println("欢迎使用学生管理系统");
            System.out.println("1. 添加学生信息");
            System.out.println("2. 删除学生信息");
            System.out.println("3. 查询学生信息");
            System.out.println("4. 修改学生信息");
            System.out.println("5. 排序学生信息");
            System.out.println("6. 统计学生信息");
            System.out.println("7. 批量导入学生信息");
            System.out.println("8. 退出系统");
            System.out.print("请输入您的选择:");

            int choice = scanner.nextInt();
            scanner.nextLine(); // 消耗换行符

            switch (choice) {
                case 1:
                    // 添加学生信息
                    System.out.print("请输入学生学号:");
                    String id = scanner.nextLine();
                    System.out.print("请输入学生姓名:");
                    String name = scanner.nextLine();
                    System.out.print("请输入学生年龄:");
                    int age = scanner.nextInt();
                    scanner.nextLine(); // 消耗换行符
                    System.out.print("请输入学生性别:");
                    String gender = scanner.nextLine();

                    Student student = new Student(id, name, age, gender);
                    manager.addStudent(student);
                    break;

                case 2:
                    // 删除学生信息
                    System.out.print("请输入要删除的学生学号:");
                    String deleteId = scanner.nextLine();
                    manager.deleteStudent(deleteId);
                    break;

                case 3:
                    // 查询学生信息
                    System.out.println("1. 按学号查询");
                    System.out.println("2. 按姓名查询");
                    System.out.print("请选择查询方式:");
                    int queryChoice = scanner.nextInt();
                    scanner.nextLine(); // 消耗换行符

                    if (queryChoice == 1) {
                        System.out.print("请输入学生学号:");
                        String queryId = scanner.nextLine();
                        manager.queryStudentById(queryId);
                    } else if (queryChoice == 2) {
                        System.out.print("请输入学生姓名:");
                        String queryName = scanner.nextLine();
                        manager.queryStudentByName(queryName);
                    } else {
                        System.out.println("输入有误,请重新选择!");
                    }
                    break;

                case 4:
                    // 修改学生信息
                    System.out.print("请输入要修改的学生学号:");
                    String modifyId = scanner.nextLine();
                    manager.modifyStudent(modifyId);
                    break;

                case 5:
                    // 排序学生信息
                    System.out.println("1. 按学号排序");
                    System.out.println("2. 按姓名排序");
                    System.out.println("3. 按年龄排序");
                    System.out.print("请选择排序方式:");
                    int sortChoice = scanner.nextInt();
                    scanner.nextLine(); // 消耗换行符

                    switch (sortChoice) {
                        case 1:
                            manager.sortStudentsById();
                            break;
                        case 2:
                            manager.sortStudentsByName();
                            break;
                        case 3:
                            manager.sortStudentsByAge();
                            break;
                        default:
                            System.out.println("输入有误,请重新选择!");
                    }
                    break;

                case 6:
                    // 统计学生信息
                    manager.countStudents();
                    break;

                case 7:
                    // 批量导入学生信息
                    System.out.print("请输入学生信息文件路径:");
                    String importFilePath = scanner.nextLine();
                    manager.importStudents(importFilePath);
                    break;

                case 8:
                    // 退出系统
                    System.out.println("感谢使用学生管理系统,再见!");
                    scanner.close();
                    return;

                default:
                    System.out.println("输入有误,请重新选择!");
            }
        }
    }
}

四、运行示例

(一)添加学生信息

运行程序后,选择“1. 添加学生信息”,输入学生信息:

欢迎使用学生管理系统
1. 添加学生信息
2. 删除学生信息
3. 查询学生信息
4. 修改学生信息
5. 排序学生信息
6. 统计学生信息
7. 批量导入学生信息
8. 退出系统
请输入您的选择:1
请输入学生学号:20240101
请输入学生姓名:张三
请输入学生年龄:20
请输入学生性别:男
学生信息添加成功!

(二)删除学生信息

选择“2. 删除学生信息”,输入要删除的学生学号:

欢迎使用学生管理系统
1. 添加学生信息
2. 删除学生信息
3. 查询学生信息
4. 修改学生信息
5. 排序学生信息
6. 统计学生信息
7. 批量导入学生信息
8. 退出系统
请输入您的选择:2
请输入要删除的学生学号:20240101
学生信息删除成功!

(三)查询学生信息

选择“3. 查询学生信息”,选择查询方式并输入相应的条件:

欢迎使用学生管理系统
1. 添加学生信息
2. 删除学生信息
3. 查询学生信息
4. 修改学生信息
5. 排序学生信息
6. 统计学生信息
7. 批量导入学生信息
8. 退出系统
请输入您的选择:3
1. 按学号查询
2. 按姓名查询
请选择查询方式:1
请输入学生学号:20240101
未找到该学号的学生!
欢迎使用学生管理系统
1. 添加学生信息
2. 删除学生信息
3. 查询学生信息
4. 修改学生信息
5. 排序学生信息
6. 统计学生信息
7. 批量导入学生信息
8. 退出系统
请输入您的选择:3
1. 按学号查询
2. 按姓名查询
请选择查询方式:2
请输入学生姓名:张三
Student{id='20240101', name='张三', age=20, gender='男'}

(四)修改学生信息

选择“4. 修改学生信息”,输入要修改的学生学号并修改信息:

欢迎使用学生管理系统
1. 添加学生信息
2. 删除学生信息
3. 查询学生信息
4. 修改学生信息
5. 排序学生信息
6. 统计学生信息
7. 批量导入学生信息
8. 退出系统
请输入您的选择:4
请输入要修改的学生学号:20240101
请输入新的学生姓名(当前:张三):李四
请输入新的学生年龄(当前:20):21
请输入新的学生性别(当前:男):女
学生信息修改成功!

(五)排序学生信息

选择“5. 排序学生信息”,选择排序方式:

欢迎使用学生管理系统
1. 添加学生信息
2. 删除学生信息
3. 查询学生信息
4. 修改学生信息
5. 排序学生信息
6. 统计学生信息
7. 批量导入学生信息
8. 退出系统
请输入您的选择:5
1. 按学号排序
2. 按姓名排序
3. 按年龄排序
请选择排序方式:1
学生信息已按学号排序!

(六)统计学生信息

选择“6. 统计学生信息”:

欢迎使用学生管理系统
1. 添加学生信息
2. 删除学生信息
3. 查询学生信息
4. 修改学生信息
5. 排序学生信息
6. 统计学生信息
7. 批量导入学生信息
8. 退出系统
请输入您的选择:6
学生总数:2
男生人数:1
女生人数:1

(七)批量导入学生信息

选择“7. 批量导入学生信息”,输入文件路径:

欢迎使用学生管理系统
1. 添加学生信息
2. 删除学生信息
3. 查询学生信息
4. 修改学生信息
5. 排序学生信息
6. 统计学生信息
7. 批量导入学生信息
8. 退出系统
请输入您的选择:7
请输入学生信息文件路径:students.txt
学生信息批量导入成功!

五、功能扩展

(一)学生信息存储到文件

目前学生信息存储在内存中,程序退出后信息会丢失。可以将学生信息存储到文件中,下次启动程序时从文件中加载学生信息。

修改StudentManager
import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class StudentManager {
    private List<Student> students; // 存储学生信息的列表
    private static final String FILE_PATH = "students.txt"; // 学生信息文件路径

    // 构造方法
    public StudentManager() {
        students = new ArrayList<>();
        loadStudents(); // 加载学生信息
    }

    // 添加学生信息
    public void addStudent(Student student) {
        students.add(student);
        System.out.println("学生信息添加成功!");
        saveStudents(); // 保存学生信息
    }

    // 根据学号删除学生信息
    public void deleteStudent(String id) {
        for (Student student : students) {
            if (student.getId().equals(id)) {
                students.remove(student);
                System.out.println("学生信息删除成功!");
                saveStudents(); // 保存学生信息
                return;
            }
        }
        System.out.println("未找到该学号的学生!");
    }

    // 根据学号查询学生信息
    public void queryStudentById(String id) {
        for (Student student : students) {
            if (student.getId().equals(id)) {
                System.out.println(student);
                return;
            }
        }
        System.out.println("未找到该学号的学生!");
    }

    // 根据姓名查询学生信息
    public void queryStudentByName(String name) {
        boolean found = false;
        for (Student student : students) {
            if (student.getName().equals(name)) {
                System.out.println(student);
                found = true;
            }
        }
        if (!found) {
            System.out.println("未找到该姓名的学生!");
        }
    }

    // 修改学生信息
    public void modifyStudent(String id) {
        for (Student student : students) {
            if (student.getId().equals(id)) {
                Scanner scanner = new Scanner(System.in);
                System.out.print("请输入新的学生姓名(当前:" + student.getName() + "):");
                String newName = scanner.nextLine();
                if (!newName.isEmpty()) {
                    student.setName(newName);
                }
                System.out.print("请输入新的学生年龄(当前:" + student.getAge() + "):");
                String ageInput = scanner.nextLine();
                if (!ageInput.isEmpty()) {
                    student.setAge(Integer.parseInt(ageInput));
                }
                System.out.print("请输入新的学生性别(当前:" + student.getGender() + "):");
                String newGender = scanner.nextLine();
                if (!newGender.isEmpty()) {
                    student.setGender(newGender);
                }
                System.out.println("学生信息修改成功!");
                saveStudents(); // 保存学生信息
                return;
            }
        }
        System.out.println("未找到该学号的学生!");
    }

    // 按学号排序
    public void sortStudentsById() {
        students.sort(Comparator.comparing(Student::getId));
        System.out.println("学生信息已按学号排序!");
    }

    // 按姓名排序
    public void sortStudentsByName() {
        students.sort(Comparator.comparing(Student::getName));
        System.out.println("学生信息已按姓名排序!");
    }

    // 按年龄排序
    public void sortStudentsByAge() {
        students.sort(Comparator.comparingInt(Student::getAge));
        System.out.println("学生信息已按年龄排序!");
    }

    // 统计学生信息
    public void countStudents() {
        int total = students.size();
        int maleCount = 0;
        int femaleCount = 0;
        for (Student student : students) {
            if ("男".equals(student.getGender())) {
                maleCount++;
            } else if ("女".equals(student.getGender())) {
                femaleCount++;
            }
        }
        System.out.println("学生总数:" + total);
        System.out.println("男生人数:" + maleCount);
        System.out.println("女生人数:" + femaleCount);
    }

    // 批量导入学生信息
    public void importStudents(String filePath) {
        try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = reader.readLine()) != null) {
                String[] data = line.split(",");
                if (data.length == 4) {
                    Student student = new Student(data[0], data[1], Integer.parseInt(data[2]), data[3]);
                    students.add(student);
                }
            }
            System.out.println("学生信息批量导入成功!");
            saveStudents(); // 保存学生信息
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("文件导入失败!");
        }
    }

    // 保存学生信息到文件
    private void saveStudents() {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(FILE_PATH))) {
            for (Student student : students) {
                writer.write(student.getId() + "," + student.getName() + "," + student.getAge() + "," + student.getGender());
                writer.newLine();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 从文件加载学生信息
    private void loadStudents() {
        try (BufferedReader reader = new BufferedReader(new FileReader(FILE_PATH))) {
            String line;
            while ((line = reader.readLine()) != null) {
                String[] data = line.split(",");
                Student student = new Student(data[0], data[1], Integer.parseInt(data[2]), data[3]);
                students.add(student);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
修改Main

无需修改Main类,因为StudentManager类已经自动加载和保存学生信息。

(二)增加学生信息修改功能

用户可以通过学号找到学生信息并修改其姓名、年龄或性别。

修改StudentManager
// 修改学生信息
public void modifyStudent(String id) {
    for (Student student : students) {
        if (student.getId().equals(id)) {
            Scanner scanner = new Scanner(System.in);
            System.out.print("请输入新的学生姓名(当前:" + student.getName() + "):");
            String newName = scanner.nextLine();
            if (!newName.isEmpty()) {
                student.setName(newName);
            }
            System.out.print("请输入新的学生年龄(当前:" + student.getAge() + "):");
            String ageInput = scanner.nextLine();
            if (!ageInput.isEmpty()) {
                student.setAge(Integer.parseInt(ageInput));
            }
            System.out.print("请输入新的学生性别(当前:" + student.getGender() + "):");
            String newGender = scanner.nextLine();
            if (!newGender.isEmpty()) {
                student.setGender(newGender);
            }
            System.out.println("学生信息修改成功!");
            saveStudents(); // 保存学生信息
            return;
        }
    }
    System.out.println("未找到该学号的学生!");
}
修改Main
case 4:
    // 修改学生信息
    System.out.print("请输入要修改的学生学号:");
    String modifyId = scanner.nextLine();
    manager.modifyStudent(modifyId);
    break;

(三)增加学生信息排序功能

用户可以选择按照学号、姓名或年龄对学生信息进行排序。

修改StudentManager
import java.util.Comparator;

// 按学号排序
public void sortStudentsById() {
    students.sort(Comparator.comparing(Student::getId));
    System.out.println("学生信息已按学号排序!");
}

// 按姓名排序
public void sortStudentsByName() {
    students.sort(Comparator.comparing(Student::getName));
    System.out.println("学生信息已按姓名排序!");
}

// 按年龄排序
public void sortStudentsByAge() {
    students.sort(Comparator.comparingInt(Student::getAge));
    System.out.println("学生信息已按年龄排序!");
}
修改Main
case 5:
    // 排序学生信息
    System.out.println("1. 按学号排序");
    System.out.println("2. 按姓名排序");
    System.out.println("3. 按年龄排序");
    System.out.print("请选择排序方式:");
    int sortChoice = scanner.nextInt();
    scanner.nextLine(); // 消耗换行符

    switch (sortChoice) {
        case 1:
            manager.sortStudentsById();
            break;
        case 2:
            manager.sortStudentsByName();
            break;
        case 3:
            manager.sortStudentsByAge();
            break;
        default:
            System.out.println("输入有误,请重新选择!");
    }
    break;

(四)增加学生信息统计功能

用户可以统计学生总数、男女生人数等。

修改StudentManager
// 统计学生信息
public void countStudents() {
    int total = students.size();
    int maleCount = 0;
    int femaleCount = 0;
    for (Student student : students) {
        if ("男".equals(student.getGender())) {
            maleCount++;
        } else if ("女".equals(student.getGender())) {
            femaleCount++;
        }
    }
    System.out.println("学生总数:" + total);
    System.out.println("男生人数:" + maleCount);
    System.out.println("女生人数:" + femaleCount);
}
修改Main
case 6:
    // 统计学生信息
    manager.countStudents();
    break;

(五)增加学生信息批量导入功能

用户可以通过文件批量导入学生信息。

修改StudentManager
// 批量导入学生信息
public void importStudents(String filePath) {
    try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
        String line;
        while ((line = reader.readLine()) != null) {
            String[] data = line.split(",");
            if (data.length == 4) {
                Student student = new Student(data[0], data[1], Integer.parseInt(data[2]), data[3]);
                students.add(student);
            }
        }
        System.out.println("学生信息批量导入成功!");
        saveStudents(); // 保存学生信息
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("文件导入失败!");
    }
}
修改Main
case 7:
    // 批量导入学生信息
    System.out.print("请输入学生信息文件路径:");
    String importFilePath = scanner.nextLine();
    manager.importStudents(importFilePath);
    break;

六、进一步优化方向

(一)用户界面优化

当前系统使用控制台交互,用户体验较为简单。可以考虑使用图形用户界面(GUI),例如使用Java的Swing或JavaFX框架来设计一个友好的用户界面,使操作更加直观和便捷。

(二)数据校验

在用户输入学生信息时,可以增加数据校验功能,例如检查学号是否唯一、年龄是否在合理范围内、性别是否为“男”或“女”等,以确保数据的准确性和完整性。

(三)异常处理

在文件操作和用户输入过程中,可能会出现各种异常情况,例如文件不存在、格式错误、输入非法字符等。可以增加异常处理机制,捕获并处理这些异常,避免程序崩溃,并给用户友好的错误提示。

(四)多线程支持

如果学生信息量较大,文件操作可能会耗时较长,影响用户体验。可以考虑使用多线程技术,将文件读写操作放在后台线程中执行,避免阻塞主线程。

(五)网络功能

如果需要在多台计算机之间共享学生信息,可以考虑增加网络功能,例如通过Socket编程实现客户端与服务器之间的通信,将学生信息存储在服务器上,客户端可以通过网络访问和操作学生信息。

七、完整代码

以下是完整的代码实现,包括所有功能扩展:

Student类

public class Student {
    private String id; // 学号
    private String name; // 姓名
    private int age; // 年龄
    private String gender; // 性别

    // 构造方法
    public Student(String id, String name, int age, String gender) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    // Getter 和 Setter 方法
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    // 重写 toString 方法
    @Override
    public String toString() {
        return "Student{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
}

StudentManager类

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class StudentManager {
    private List<Student> students; // 存储学生信息的列表
    private static final String FILE_PATH = "students.txt"; // 学生信息文件路径

    // 构造方法
    public StudentManager() {
        students = new ArrayList<>();
        loadStudents(); // 加载学生信息
    }

    // 添加学生信息
    public void addStudent(Student student) {
        students.add(student);
        System.out.println("学生信息添加成功!");
        saveStudents(); // 保存学生信息
    }

    // 根据学号删除学生信息
    public void deleteStudent(String id) {
        for (Student student : students) {
            if (student.getId().equals(id)) {
                students.remove(student);
                System.out.println("学生信息删除成功!");
                saveStudents(); // 保存学生信息
                return;
            }
        }
        System.out.println("未找到该学号的学生!");
    }

    // 根据学号查询学生信息
    public void queryStudentById(String id) {
        for (Student student : students) {
            if (student.getId().equals(id)) {
                System.out.println(student);
                return;
            }
        }
        System.out.println("未找到该学号的学生!");
    }

    // 根据姓名查询学生信息
    public void queryStudentByName(String name) {
        boolean found = false;
        for (Student student : students) {
            if (student.getName().equals(name)) {
                System.out.println(student);
                found = true;
            }
        }
        if (!found) {
            System.out.println("未找到该姓名的学生!");
        }
    }

    // 修改学生信息
    public void modifyStudent(String id) {
        for (Student student : students) {
            if (student.getId().equals(id)) {
                Scanner scanner = new Scanner(System.in);
                System.out.print("请输入新的学生姓名(当前:" + student.getName() + "):");
                String newName = scanner.nextLine();
                if (!newName.isEmpty()) {
                    student.setName(newName);
                }
                System.out.print("请输入新的学生年龄(当前:" + student.getAge() + "):");
                String ageInput = scanner.nextLine();
                if (!ageInput.isEmpty()) {
                    student.setAge(Integer.parseInt(ageInput));
                }
                System.out.print("请输入新的学生性别(当前:" + student.getGender() + "):");
                String newGender = scanner.nextLine();
                if (!newGender.isEmpty()) {
                    student.setGender(newGender);
                }
                System.out.println("学生信息修改成功!");
                saveStudents(); // 保存学生信息
                return;
            }
        }
        System.out.println("未找到该学号的学生!");
    }

    // 按学号排序
    public void sortStudentsById() {
        students.sort(Comparator.comparing(Student::getId));
        System.out.println("学生信息已按学号排序!");
    }

    // 按姓名排序
    public void sortStudentsByName() {
        students.sort(Comparator.comparing(Student::getName));
        System.out.println("学生信息已按姓名排序!");
    }

    // 按年龄排序
    public void sortStudentsByAge() {
        students.sort(Comparator.comparingInt(Student::getAge));
        System.out.println("学生信息已按年龄排序!");
    }

    // 统计学生信息
    public void countStudents() {
        int total = students.size();
        int maleCount = 0;
        int femaleCount = 0;
        for (Student student : students) {
            if ("男".equals(student.getGender())) {
                maleCount++;
            } else if ("女".equals(student.getGender())) {
                femaleCount++;
            }
        }
        System.out.println("学生总数:" + total);
        System.out.println("男生人数:" + maleCount);
        System.out.println("女生人数:" + femaleCount);
    }

    // 批量导入学生信息
    public void importStudents(String filePath) {
        try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = reader.readLine()) != null) {
                String[] data = line.split(",");
                if (data.length == 4) {
                    Student student = new Student(data[0], data[1], Integer.parseInt(data[2]), data[3]);
                    students.add(student);
                }
            }
            System.out.println("学生信息批量导入成功!");
            saveStudents(); // 保存学生信息
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("文件导入失败!");
        }
    }

    // 保存学生信息到文件
    private void saveStudents() {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(FILE_PATH))) {
            for (Student student : students) {
                writer.write(student.getId() + "," + student.getName() + "," + student.getAge() + "," + student.getGender());
                writer.newLine();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 从文件加载学生信息
    private void loadStudents() {
        try (BufferedReader reader = new BufferedReader(new FileReader(FILE_PATH))) {
            String line;
            while ((line = reader.readLine()) != null) {
                String[] data = line.split(",");
                Student student = new Student(data[0], data[1], Integer.parseInt(data[2]), data[3]);
                students.add(student);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Main类

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        StudentManager manager = new StudentManager(); // 创建学生管理对象
        Scanner scanner = new Scanner(System.in); // 创建扫描器对象

        while (true) {
            System.out.println("欢迎使用学生管理系统");
            System.out.println("1. 添加学生信息");
            System.out.println("2. 删除学生信息");
            System.out.println("3. 查询学生信息");
            System.out.println("4. 修改学生信息");
            System.out.println("5. 排序学生信息");
            System.out.println("6. 统计学生信息");
            System.out.println("7. 批量导入学生信息");
            System.out.println("8. 退出系统");
            System.out.print("请输入您的选择:");

            int choice = scanner.nextInt();
            scanner.nextLine(); // 消耗换行符

            switch (choice) {
                case 1:
                    // 添加学生信息
                    System.out.print("请输入学生学号:");
                    String id = scanner.nextLine();
                    System.out.print("请输入学生姓名:");
                    String name = scanner.nextLine();
                    System.out.print("请输入学生年龄:");
                    int age = scanner.nextInt();
                    scanner.nextLine(); // 消耗换行符
                    System.out.print("请输入学生性别:");
                    String gender = scanner.nextLine();

                    Student student = new Student(id, name, age, gender);
                    manager.addStudent(student);
                    break;

                case 2:
                    // 删除学生信息
                    System.out.print("请输入要删除的学生学号:");
                    String deleteId = scanner.nextLine();
                    manager.deleteStudent(deleteId);
                    break;

                case 3:
                    // 查询学生信息
                    System.out.println("1. 按学号查询");
                    System.out.println("2. 按姓名查询");
                    System.out.print("请选择查询方式:");
                    int queryChoice = scanner.nextInt();
                    scanner.nextLine(); // 消耗换行符

                    if (queryChoice == 1) {
                        System.out.print("请输入学生学号:");
                        String queryId = scanner.nextLine();
                        manager.queryStudentById(queryId);
                    } else if (queryChoice == 2) {
                        System.out.print("请输入学生姓名:");
                        String queryName = scanner.nextLine();
                        manager.queryStudentByName(queryName);
                    } else {
                        System.out.println("输入有误,请重新选择!");
                    }
                    break;

                case 4:
                    // 修改学生信息
                    System.out.print("请输入要修改的学生学号:");
                    String modifyId = scanner.nextLine();
                    manager.modifyStudent(modifyId);
                    break;

                case 5:
                    // 排序学生信息
                    System.out.println("1. 按学号排序");
                    System.out.println("2. 按姓名排序");
                    System.out.println("3. 按年龄排序");
                    System.out.print("请选择排序方式:");
                    int sortChoice = scanner.nextInt();
                    scanner.nextLine(); // 消耗换行符

                    switch (sortChoice) {
                        case 1:
                            manager.sortStudentsById();
                            break;
                        case 2:
                            manager.sortStudentsByName();
                            break;
                        case 3:
                            manager.sortStudentsByAge();
                            break;
                        default:
                            System.out.println("输入有误,请重新选择!");
                    }
                    break;

                case 6:
                    // 统计学生信息
                    manager.countStudents();
                    break;

                case 7:
                    // 批量导入学生信息
                    System.out.print("请输入学生信息文件路径:");
                    String importFilePath = scanner.nextLine();
                    manager.importStudents(importFilePath);
                    break;

                case 8:
                    // 退出系统
                    System.out.println("感谢使用学生管理系统,再见!");
                    scanner.close();
                    return;

                default:
                    System.out.println("输入有误,请重新选择!");
            }
        }
    }
}

八、测试用例

(一)添加学生信息

运行程序后,选择“1. 添加学生信息”,输入学生信息:

欢迎使用学生管理系统
1. 添加学生信息
2. 删除学生信息
3. 查询学生信息
4. 修改学生信息
5. 排序学生信息
6. 统计学生信息
7. 批量导入学生信息
8. 退出系统
请输入您的选择:1
请输入学生学号:20240101
请输入学生姓名:张三
请输入学生年龄:20
请输入学生性别:男
学生信息添加成功!

(二)删除学生信息

选择“2. 删除学生信息”,输入要删除的学生学号:

欢迎使用学生管理系统
1. 添加学生信息
2. 删除学生信息
3. 查询学生信息
4. 修改学生信息
5. 排序学生信息
6. 统计学生信息
7. 批量导入学生信息
8. 退出系统
请输入您的选择:2
请输入要删除的学生学号:20240101
学生信息删除成功!

(三)查询学生信息

选择“3. 查询学生信息”,选择查询方式并输入相应的条件:

欢迎使用学生管理系统
1. 添加学生信息
2. 删除学生信息
3. 查询学生信息
4. 修改学生信息
5. 排序学生信息
6. 统计学生信息
7. 批量导入学生信息
8. 退出系统
请输入您的选择:3
1. 按学号查询
2. 按姓名查询
请选择查询方式:1
请输入学生学号:20240101
未找到该学号的学生!
欢迎使用学生管理系统
1. 添加学生信息
2. 删除学生信息
3. 查询学生信息
4. 修改学生信息
5. 排序学生信息
6. 统计学生信息
7. 批量导入学生信息
8. 退出系统
请输入您的选择:3
1. 按学号查询
2. 按姓名查询
请选择查询方式:2
请输入学生姓名:张三
Student{id='20240101', name='张三', age=20, gender='男'}

(四)修改学生信息

选择“4. 修改学生信息”,输入要修改的学生学号并修改信息:

欢迎使用学生管理系统
1. 添加学生信息
2. 删除学生信息
3. 查询学生信息
4. 修改学生信息
5. 排序学生信息
6. 统计学生信息
7. 批量导入学生信息
8. 退出系统
请输入您的选择:4
请输入要修改的学生学号:20240101
请输入新的学生姓名(当前:张三):李四
请输入新的学生年龄(当前:20):21
请输入新的学生性别(当前:男):女
学生信息修改成功!

(五)排序学生信息

选择“5. 排序学生信息”,选择排序方式:

欢迎使用学生管理系统
1. 添加学生信息
2. 删除学生信息
3. 查询学生信息
4. 修改学生信息
5. 排序学生信息
6. 统计学生信息
7. 批量导入学生信息
8. 退出系统
请输入您的选择:5
1. 按学号排序
2. 按姓名排序
3. 按年龄排序
请选择排序方式:1
学生信息已按学号排序!

(六)统计学生信息

选择“6. 统计学生信息”:

欢迎使用学生管理系统
1. 添加学生信息
2. 删除学生信息
3. 查询学生信息
4. 修改学生信息
5. 排序学生信息
6. 统计学生信息
7. 批量导入学生信息
8. 退出系统
请输入您的选择:6
学生总数:2
男生人数:1
女生人数:1

(七)批量导入学生信息

选择“7. 批量导入学生信息”,输入文件路径:

欢迎使用学生管理系统
1. 添加学生信息
2. 删除学生信息
3. 查询学生信息
4. 修改学生信息
5. 排序学生信息
6. 统计学生信息
7. 批量导入学生信息
8. 退出系统
请输入您的选择:7
请输入学生信息文件路径:students.txt
学生信息批量导入成功!

九、进一步优化方向

(一)用户界面优化

当前系统使用控制台交互,用户体验较为简单。可以考虑使用图形用户界面(GUI),例如使用Java的Swing或JavaFX框架来设计一个友好的用户界面,使操作更加直观和便捷。

(二)数据校验

在用户输入学生信息时,可以增加数据校验功能,例如检查学号是否唯一、年龄是否在合理范围内、性别是否为“男”或“女”等,以确保数据的准确性和完整性。

(三)异常处理

在文件操作和用户输入过程中,可能会出现各种异常情况,例如文件不存在、格式错误、输入非法字符等。可以增加异常处理机制,捕获并处理这些异常,避免程序崩溃,并给用户友好的错误提示。

(四)多线程支持

如果学生信息量较大,文件操作可能会耗时较长,影响用户体验。可以考虑使用多线程技术,将文件读写操作放在后台线程中执行,避免阻塞主线程。

(五)网络功能

如果需要在多台计算机之间共享学生信息,可以考虑增加网络功能,例如通过Socket编程实现客户端与服务器之间的通信,将学生信息存储在服务器上,客户端可以通过网络访问和操作学生信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值