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` 能夠正確地識別重復的元素。
?