1.前期准备
(1)新建java项目
(2)新建java软件包以及三个文件Student.java,Student.txt,StuSystem.java
Student.java
package student_management_system;public class Student {private String id;private String name;private int age;private String address;public Student(){}public Student(String id,String name,int age,String address){this.id=id;this.name=name;this.age=age;this.address=address;}public String getId() {return id;}public void setId(String id) {this.id = id;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}}
StuSystem.java
package student_management_system;import java.io.*;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Scanner;public class StuSystem {public static void saveStudentsToFile(ArrayList<Student> list,String file) { //保存文件
// 每次调用 saveStudentsToFile 方法时,都会覆盖 Student.txt 文件中的现有内容。
// 如果你希望在文件末尾追加内容,可以在 FileWriter 构造函数中传递一个额外的 true 参数,以启用追加模式。
// new FileWriter("Student.txt", true)try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {writer.write(String.format("%-10s\t%-15s\t%-5s\t%-30s\n", "id", "姓名", "年龄", "家庭住址"));for (Student stu : list) {writer.write(String.format("%-10s\t%-15s\t%-5s\t%-30s\n", stu.getId(), stu.getName(), stu.getAge(), stu.getAddress()));}} catch (IOException e) {e.printStackTrace();}}public static ArrayList<Student> loadStudentsFromFile(String file) {ArrayList<Student> list = new ArrayList<>();try (BufferedReader reader = new BufferedReader(new FileReader(file))) {String line;// 跳过标题行reader.readLine();while ((line = reader.readLine()) != null) {// 使用正则表达式 \s+ 来匹配一个或多个空格作为分隔符String[] data = line.split("\\s+");if (data.length == 4) {Student student = new Student(data[0], data[1], Integer.parseInt(data[2]), data[3]);list.add(student);}}} catch (IOException e) {e.printStackTrace();}return list;}public static void main(String[] args) {// 打印当前的工作目录System.out.println("Current working directory: " + System.getProperty("user.dir"));ArrayList<Student> list=new ArrayList<>();String file="./src/student_management_system/Student.txt";list=loadStudentsFromFile(file);boolean flag=true;while (flag) {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("请输入您的选择:");Scanner sc=new Scanner(System.in);String choose=sc.next();switch(choose){case "1" -> {System.out.println("添加学生");addStudent(list);break;}case "2" -> {System.out.println("删除学生");deleteStudent(list);break;}case "3" -> {System.out.println("修改学生");updateStudent(list);break;}case "4" -> {System.out.println("查询某个学生");findOneStudent(list);break;}case "5" -> {System.out.println("查询全部学生");query_allStudent(list);break;}case "6" -> {System.out.println("退出");saveStudentsToFile(list,file); // 保存到文件flag=false;break;}default -> System.out.println("没有这个选项");}}}public static void addStudent(ArrayList<Student> list){Scanner sc=new Scanner(System.in);String id= null;while (true) {System.out.println("请输入学生的id");id = sc.next();int a=getIndex(list,id);if(a==-1) break;else System.out.println("这个学生的id已存在,请重新输入!");}System.out.println("请输入学生的name");String name=sc.next();System.out.println("请输入学生的age");int age=sc.nextInt();System.out.println("请输入学生的address");String address=sc.next();Student student=new Student(id,name,age,address);list.add(student);System.out.printf("学号为%s的学生已成功添加!\n",id);}public static void deleteStudent(ArrayList<Student> list){Scanner sc=new Scanner(System.in);while (true) {System.out.println("请输入学生的id");String id=sc.next();int a=getIndex(list,id);if (a==-1) System.out.println("这个学生id不存在,请重新输入!");else{list.remove(a);System.out.printf("学号为%s的学生已成功删除!\n",id);break;}}}public static void updateStudent(ArrayList<Student> list){Scanner sc=new Scanner(System.in);while (true) {System.out.println("请输入学生的id");String id=sc.next();int a=getIndex(list,id);if (a==-1) System.out.println("这个学生id不存在,请重新输入!");else{System.out.println("请输入学生的name");String name=sc.next();System.out.println("请输入学生的age");int age=sc.nextInt();System.out.println("请输入学生的address");String address=sc.next();Student student=new Student(id,name,age,address);list.set(a,student);System.out.printf("学号为%s的学生已成功修改!\n",id);break;}}}public static void findOneStudent(ArrayList<Student> list){Scanner sc = new Scanner(System.in);while (true) {System.out.println("请输入学生的id");String id = sc.next();int a = getIndex(list, id);if (a == -1) {System.out.println("这个学生id不存在,请重新输入!");} else {Student stu = list.get(a);
// %-5s 表示输出一个字符串,并且这个字符串应该左对齐,至少占用5个字符的宽度。如果字符串长度小于5,那么右边会用空格填充;System.out.printf("学号为%s的学生的信息已成功查询到!\n", id);System.out.printf("%-10s\t%-15s\t%-5s\t%-30s\n", "id", "姓名", "年龄", "家庭住址");System.out.printf("%-10s\t%-15s\t%-5s\t%-30s\n", stu.getId(), stu.getName(), stu.getAge(), stu.getAddress());break;}}}public static void query_allStudent(ArrayList<Student> list){if(list.isEmpty()){System.out.println("当前无学生信息,请添加后再查询!");return;}System.out.printf("%-10s\t%-15s\t%-5s\t%-30s\n", "id", "姓名", "年龄", "家庭住址");for(int i = 0; i < list.size(); i++){Student stu = list.get(i);System.out.printf("%-10s\t%-15s\t%-5s\t%-30s\n", stu.getId(), stu.getName(), stu.getAge(), stu.getAddress());}}public static int getIndex(ArrayList<Student> list,String id){for(int i=0;i<list.size();i++){Student student=list.get(i);String sid=student.getId();if(sid.equals(id)){return i;}}return -1; //如果查找的学生id不存在时返回-1}}
2.StuSystem.java的函数
(1)主函数main()
public static void main(String[] args) {// 打印当前的工作目录System.out.println("Current working directory: " + System.getProperty("user.dir"));ArrayList<Student> list=new ArrayList<>();String file="./src/student_management_system/Student.txt";list=loadStudentsFromFile(file);boolean flag=true;while (flag) {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("请输入您的选择:");Scanner sc=new Scanner(System.in);String choose=sc.next();switch(choose){case "1" -> {System.out.println("添加学生");addStudent(list);break;}case "2" -> {System.out.println("删除学生");deleteStudent(list);break;}case "3" -> {System.out.println("修改学生");updateStudent(list);break;}case "4" -> {System.out.println("查询某个学生");findOneStudent(list);break;}case "5" -> {System.out.println("查询全部学生");query_allStudent(list);break;}case "6" -> {System.out.println("退出");saveStudentsToFile(list,file); // 保存到文件flag=false;break;}default -> System.out.println("没有这个选项");}}}
(2)添加学生
public static void addStudent(ArrayList<Student> list){Scanner sc=new Scanner(System.in);String id= null;while (true) {System.out.println("请输入学生的id");id = sc.next();int a=getIndex(list,id);if(a==-1) break;else System.out.println("这个学生的id已存在,请重新输入!");}System.out.println("请输入学生的name");String name=sc.next();System.out.println("请输入学生的age");int age=sc.nextInt();System.out.println("请输入学生的address");String address=sc.next();Student student=new Student(id,name,age,address);list.add(student);System.out.printf("学号为%s的学生已成功添加!\n",id);}
(3)删除学生
public static void deleteStudent(ArrayList<Student> list){Scanner sc=new Scanner(System.in);while (true) {System.out.println("请输入学生的id");String id=sc.next();int a=getIndex(list,id);if (a==-1) System.out.println("这个学生id不存在,请重新输入!");else{list.remove(a);System.out.printf("学号为%s的学生已成功删除!\n",id);break;}}}
(4)修改学生
public static void updateStudent(ArrayList<Student> list){Scanner sc=new Scanner(System.in);while (true) {System.out.println("请输入学生的id");String id=sc.next();int a=getIndex(list,id);if (a==-1) System.out.println("这个学生id不存在,请重新输入!");else{System.out.println("请输入学生的name");String name=sc.next();System.out.println("请输入学生的age");int age=sc.nextInt();System.out.println("请输入学生的address");String address=sc.next();Student student=new Student(id,name,age,address);list.set(a,student);System.out.printf("学号为%s的学生已成功修改!\n",id);break;}}}
(5)查询某个学生
public static void findOneStudent(ArrayList<Student> list){Scanner sc = new Scanner(System.in);while (true) {System.out.println("请输入学生的id");String id = sc.next();int a = getIndex(list, id);if (a == -1) {System.out.println("这个学生id不存在,请重新输入!");} else {Student stu = list.get(a);
// %-5s 表示输出一个字符串,并且这个字符串应该左对齐,至少占用5个字符的宽度。如果字符串长度小于5,那么右边会用空格填充;System.out.printf("学号为%s的学生的信息已成功查询到!\n", id);System.out.printf("%-10s\t%-15s\t%-5s\t%-30s\n", "id", "姓名", "年龄", "家庭住址");System.out.printf("%-10s\t%-15s\t%-5s\t%-30s\n", stu.getId(), stu.getName(), stu.getAge(), stu.getAddress());break;}}}
(6)查询全部学生
public static void query_allStudent(ArrayList<Student> list){if(list.isEmpty()){System.out.println("当前无学生信息,请添加后再查询!");return;}System.out.printf("%-10s\t%-15s\t%-5s\t%-30s\n", "id", "姓名", "年龄", "家庭住址");for(int i = 0; i < list.size(); i++){Student stu = list.get(i);System.out.printf("%-10s\t%-15s\t%-5s\t%-30s\n", stu.getId(), stu.getName(), stu.getAge(), stu.getAddress());}}
(7)根据学生id来查找学生信息在数组序列list中的索引
//如果查找的学生id不存在时返回-1
public static int getIndex(ArrayList<Student> list,String id){for(int i=0;i<list.size();i++){Student student=list.get(i);String sid=student.getId();if(sid.equals(id)){return i;}}return -1; //如果查找的学生id不存在时返回-1}
(8)保存数据到文件(以覆盖写的方式)
public static void saveStudentsToFile(ArrayList<Student> list,String file) { //保存文件
// 每次调用 saveStudentsToFile 方法时,都会覆盖 Student.txt 文件中的现有内容。
// 如果你希望在文件末尾追加内容,可以在 FileWriter 构造函数中传递一个额外的 true 参数,以启用追加模式。
// new FileWriter("Student.txt", true)try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {writer.write(String.format("%-10s\t%-15s\t%-5s\t%-30s\n", "id", "姓名", "年龄", "家庭住址"));for (Student stu : list) {writer.write(String.format("%-10s\t%-15s\t%-5s\t%-30s\n", stu.getId(), stu.getName(), stu.getAge(), stu.getAddress()));}} catch (IOException e) {e.printStackTrace();}}
(9)从文件读取数据
public static ArrayList<Student> loadStudentsFromFile(String file) {ArrayList<Student> list = new ArrayList<>();try (BufferedReader reader = new BufferedReader(new FileReader(file))) {String line;// 跳过标题行reader.readLine();while ((line = reader.readLine()) != null) {// 使用正则表达式 \s+ 来匹配一个或多个空格作为分隔符String[] data = line.split("\\s+");if (data.length == 4) {Student student = new Student(data[0], data[1], Integer.parseInt(data[2]), data[3]);list.add(student);}}} catch (IOException e) {e.printStackTrace();}return list;}
3.运行测试
(1)添加学生
(2)删除学生
(3)修改学生
4.补充笔记
(1)建议收藏的网站
网站:Java 教程 | 菜鸟教程
(2)ArrayList请问这个类型允许重复值吗
在 Java 中,`ArrayList` 是一个允许重复元素的集合类型。它实现了 `List` 接口,可以包含重复的元素,并且没有限制元素必须唯一。这意味着你可以在同一个 `ArrayList` 实例中多次添加同一个对象。
例如,如果你有一个 `ArrayList<Student>`,你可以添加多个 `Student` 对象,包括具有相同属性的 `Student` 对象。这里是如何添加重复元素到 `ArrayList` 的一个简单示例:
```java
ArrayList<Student> students = new ArrayList<>();
Student student1 = new Student("001", "Alice", 20, "123 Main St");
Student student2 = new Student("002", "Bob", 22, "456 Elm St");
// 添加学生到列表
students.add(student1);
students.add(student2);
students.add(student1); // 再次添加 student1,这将导致列表中有重复的元素
// 打印列表中的所有学生
for (Student student : students) {
System.out.println(student);
}
```
在这个例子中,`student1` 被添加了两次,所以在 `ArrayList` 中会有重复的元素。
如果你需要一个不允许重复元素的集合,你可以考虑使用 `Set` 接口的实现,如 `HashSet` 或 `LinkedHashSet`。这些集合类型不允许重复元素,如果尝试添加一个已经存在的元素,它将被忽略。例如:
```java
Set<Student> studentsSet = new HashSet<>();
studentsSet.add(student1);
studentsSet.add(student2);
// studentsSet.add(student1); // 这将不会添加重复的 student1
```
请注意,使用 `Set` 时,元素的相等性是通过 `equals()` 方法来判断的,所以你需要确保你的 `Student` 类正确地实现了 `equals()` 和 `hashCode()` 方法,以便 `Set` 能够正确地识别重复的元素。