学生管理系统(java)

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)建议收藏的网站

网站: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` 能够正确地识别重复的元素。

相关推荐
cooldream20092 分钟前
在Spring Security中使用权限注解实现精确控制
java·spring·springboot
小马爱打代码2 分钟前
Spring Boot 启动流程及原理介绍
java·spring boot
魏+Mtiao15_3 分钟前
短视频矩阵系统功能介绍与独立部署流程
java·大数据·人工智能·矩阵
半夜下雨13 分钟前
每日十题八股-2024年12月11日
java
CVer儿15 分钟前
条件编译->enable_if和 if constexpr使用区别
java·开发语言·c++
ThetaarSofVenice15 分钟前
【Java从入门到放弃 之 HashMap 和 HashSet】
java·哈希算法·散列表
Easy_Company17 分钟前
关于Redis哨兵机制实验操作步骤
java·大数据·数据库·redis·缓存
Nijika...19 分钟前
RabbitMQ监听器在并发情况下的基本使用方法
java·spring·rabbitmq
菜鸡且互啄6921 分钟前
派单调度啊
java
TsengOnce22 分钟前
Docker 安装 Jenkins:2.346.3
java·docker·jenkins