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
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()
java
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)添加学生
java
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)删除学生
java
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)修改学生
java
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)查询某个学生
java
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)查询全部学生
java
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
java
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)保存数据到文件(以覆盖写的方式)
java
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)从文件读取数据
java
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)建议收藏的网站
(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` 能够正确地识别重复的元素。