一、需求分析
学生管理系统是一个常见的应用场景,用于管理学生的基本信息。本系统需要实现以下功能:
- 添加学生信息:用户可以输入学生的姓名、年龄、性别和学号等信息,将其添加到系统中。
- 删除学生信息:用户可以通过学号来删除指定的学生信息。
- 查询学生信息:用户可以通过学号或姓名来查询学生信息,系统会显示该学生的详细信息。
- 修改学生信息:用户可以通过学号找到学生信息并修改其姓名、年龄或性别。
- 学生信息排序:用户可以选择按照学号、姓名或年龄对学生信息进行排序。
- 学生信息统计:用户可以统计学生总数、男女生人数等。
- 批量导入学生信息:用户可以通过文件批量导入学生信息。
- 数据持久化:学生信息需要存储到文件中,下次启动程序时能够从文件中加载学生信息。
为了实现这些功能,我们需要设计一个合适的数据结构来存储学生信息,并提供相应的操作接口。
二、系统设计
(一)类的设计
-
Student类
- 属性:
id
(学号):唯一标识一个学生。name
(姓名):学生的姓名。age
(年龄):学生的年龄。gender
(性别):学生的性别。
- 方法:
- 构造方法:用于创建学生对象时初始化属性。
toString()
:重写该方法,用于返回学生信息的字符串表示。
- 属性:
-
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()
:从文件加载学生信息。
- 属性:
-
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编程实现客户端与服务器之间的通信,将学生信息存储在服务器上,客户端可以通过网络访问和操作学生信息。