适用于新手的使用Java的ArrayList集合写的学生管理系统(新手必看~)

适用于新手的使用Java的ArrayList集合写的学生管理系统

使用了numCheck()方法确保了不会出现Scanner错误

具体需要:ArrayList集合,while+switch主程序,try-catch与while的联合使用,封装的基本使用,return的结束方法使用

以下是numCheck()方法,可以避免在录入nextInt()时用户输入非数字:

public static int numCheck(){//确保输入数字
        int num;
        while(true){
            try {
                num = sc.nextInt();
                return num;
            }catch (Exception e){
                sc.next();//清空里面的错误数据,否则会因为sc里存储了错误数据而不停触发catch造成死循环
                System.out.println("错误!你输入了非数字!请输入数字:>>>");
            }
        }
    }

注意事项:该方法会返回一个int值,因此可以直接使用该方法,如:
int a = numCheck();//numCheck()返回的int值就会直接赋值给a了

其中num = sc.nextInt();会接收用户输入的数值,如果输入正确java就不会报错,因此会执行return num;也就是将用户输入的值返回。
ps : return会直接结束方法,而while循环在方法之中,方法都结束了,因此while作为方法体内的函数自然也会结束。

如果用户输入了非数字,会导致java报错,因此catch会被触发,直接执行sc.next();,该语句会将一开始用户输入的错误数据捕获,否则错误数据会一直存储在sc中导致java报错,随后不断触发catch。
sc.next();捕获错误数据后,会执行sout内容,随后由于while循环未破,再次执行try语块内容,即num = sc.nextInt();再次从键盘输入中获取用户输入。

以下是完整代码,首先是Students的封装

public class Students {
    private String name;
    private String ID;
    private int age;
    private String location;

    public Students() {
    }

    public Students(String name, String ID, int age, String location) {
        this.name = name;
        this.ID = ID;
        this.age = age;
        this.location = location;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    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 getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }
}

如果你是新手刚刚初识封装,那么请看下面讲解:
封装需要以下几个模块:
第一个模块就是private的属性。
比如姓名就可以写

private String name;

其中private代表私有,String则是数据类型,name是变量名字。

第二个模块就是空参构造和有参构造。
java是面向对象,因此需要创建对象,而创建对象,就是调用构造函数来实现的。
比如我有一个学生的对象,该java类名字就写为Student

public class Student{
	private String name;

	public Student() {
    }

    public Student(String name) {
        this.name = name;
    }
}

第一行代码自然是java类的开头
第二行则是创建了一个私有的属性
下面有两个方法,一个是Student(),一个是Student(String name).
前面就是空参构造,后面就是有参构造。
这就是创建对象需要调用的方法了。
如果你需要创建一个学生对象,就需要这样写:

Student stu1 = new Student();//第一种写法

Student stu2 = new Student("帅哥读者");//第二种写法

String name1 = "帅哥读者";
Student stu3 = new Student(name);//第三种写法

Scanner sc = new Scanner(System.in);
String name2 = sc.next();
Student stu4 = new Student(name2);//第四种写法

这四种写法分别创建了4个学生对象,而这四个学生对象的实体名字就是stu1~4.
当然,这个变量名字可以自己随便写。
后三种写法都是调用了有参构造来创建了一个有名字的学生对象。
这几个stu2,stu3,stu4中都含有一个名字的变量。

这样我们就可以使用这个名字了,但是使用名字,需要方法,因为我们的Student类中,写的name是private类型,私有的,因此需要一个getName()和setName()方法来对这个name变量进行获取内容以及设定/修改内容。

	public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

这两个方法都是public,这样才能被其他类所调用。
其中getName就是将name变量的内容传递出去,setName则需要在调用时提供一个变量进去,然后程序就会将该学生的名字变量进行修改了。
如下:

String a = stu2.getName()System.out.println(a);

第一行代码调用了stu2这个学生对象中的getName()方法,这个方法会返回stu2这个学生对象的名字变量的内容,也就是”帅哥读者“,是String类型的。
然后该string类型的”帅哥读者“就会被赋值给同样是string类型的变量a了。
在sout给a,就会将a打印出来了。
这里也可以直接System.out.println(stu2.getName()); ,也就是说并不需要a这个变量进行中转,这里这样写是为了方便新手理解。

那么读者还记得我们的stu1吗,这个学生对象我们调用的空参构造,因此里面的name变量仍然是空的,没有进行赋值,那么我们就可以通过setName()进行赋值了!

stu1.setName("帅哥读者");//第一种写法

String a = "帅哥读者";
stu1.setName(a);//第二种写法

//第三种写法是sc获取,这里就不赘述了。

这样,我们就将”帅哥读者“这个字符串传递给stu1这个对象的name变量了,此时我们就可以

System.out.println(stu1.getName());

这样,stu1里面存储的name变量就可以被打印出来了:”帅哥读者“。

以上就是封装的基本使用了,this这些我就不赘述了,不过新手的话还是必须得懂this是怎么使用的,可以自行百度~

以下是主类的全部代码啦,然后就没了,该程序就2个类,一个Students类用来创建学生对象,然后在主类中使用了ArrayList集合来存储这些学生对象。
不过建议使用HashMap等集合来优化,因为ArrayList的特性会导致程序运行速度不高(比如在查找集合中某一个学生时,它只能全部扫描,即使可以使用break;等提前破除查找循环,效率依旧极低)

import java.util.ArrayList;
import java.util.Scanner;

public class runtime {
    static Scanner sc = new Scanner(System.in);
    static ArrayList<Students> arrStu = new ArrayList<>();//集合存储学生对象

    public static void main(String[] args) {//程序从这里开始
        String flag = "on";//主程序循环开关

        while (flag.equals("on")) {
            switch (welcome()) {//操作
                case 1 -> addStu();
                case 2 -> deleteStu();
                case 3 ->modifyStu();
                case 4 -> displayStu();
                case 5 -> {
                    flag = "off";
                    System.out.println("退出成功!");
                }
            }
        }
    }

    public static int welcome(){//开始菜单
        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("请输入您的选择:>>>");

        return numCheck();
    }

    public static void addStu(){//添加学生
        while (true) {
            System.out.println("--------------------------");
            System.out.println("请输入学生ID:>>>");
            String ID = sc.next();
            if(checkStu(ID)){
                System.out.println("该ID已被占用!请重新输入!");
                continue;
            }
            System.out.println("请输入学生姓名:>>>");
            String name = sc.next();
            System.out.println("请输入学生年龄:>>>");
            int age = numCheck();
            System.out.println("请输入学生家庭住址:>>>");
            String location = sc.next();

            Students stu = new Students(name, ID, age, location);
            arrStu.add(stu);
            break;
        }
    }

    public static void deleteStu(){//删除学生
        System.out.println("--------------------------");
        System.out.println("请输入学生ID:>>>");
        String ID = sc.next();
        System.out.println("查找ing...");
        if(checkStu(ID)){
            for (int i = 0; i < arrStu.size(); i++) {
                Students stu = arrStu.get(i);
                if(ID.equals(stu.getID())){
                    arrStu.remove(i);
                    break;
                }
            }
            System.out.println("已找到该学生,删除成功!");

        }else {
            System.out.println("未发现该学生!");
        }

    }

    public static void modifyStu(){//修改学生
        System.out.println("--------------------------");
        System.out.println("请输入要修改的学生的ID:>>>");
        String ID = sc.next();
        if(checkStu(ID)){
            for (Students stu : arrStu) {
                if (ID.equals(stu.getID())) {
                    System.out.println("请输入学生的新ID:>>>");
                    String newID = sc.next();
                    System.out.println("请输入学生的新姓名:>>>");
                    String newName = sc.next();
                    System.out.println("请输入学生的新年龄:>>>");
                    int newAge = numCheck();
                    System.out.println("请输入学生的新家庭住址:>>>");
                    String newLocation = sc.next();
                    System.out.println("修改ing...");

                    stu.setID(newID);
                    stu.setName(newName);
                    stu.setAge(newAge);
                    stu.setLocation(newLocation);

                    System.out.println("修改成功!");
                }
            }
        }else {
            System.out.println("未发现该学生!请检查ID是否输入正确!");
        }
    }

    public static void displayStu(){//查询学生
        System.out.println("id\t\t\t" + "姓名\t\t" + "年龄\t\t" + "家庭住址");
        for (Students stu : arrStu) {
            System.out.println(stu.getID() + "\t\t\t" + stu.getName() + "\t\t"
                + stu.getAge() + "\t\t\t" + stu.getLocation());
        }
    }

    public static boolean checkStu(String ID){//确定ID是否被占用,true占用,false未占用

        for (Students stu : arrStu) {
            if (ID.equals(stu.getID())) {
                return true;
            }
        }

        return false;
    }

    public static int numCheck(){//确保输入数字
        int num;
        while(true){
            try {
                num = sc.nextInt();
                return num;
            }catch (Exception e){
                sc.next();//清空里面的错误数据,否则会因为sc里存储了错误数据而不停触发catch造成死循环
                System.out.println("错误!你输入了非数字!请输入数字:>>>");
            }
        }
    }

}

对新手的ps提醒:如果一个代码太长不知道从哪看的时候,请从psvm也就是main函数开始看哦。
因为程序是从main函数开始执行的,所有非main的其他方法都只会在main中被调用了才会运行。
因此请逐行从main方法体中进行查看。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值