适用于新手的使用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方法体中进行查看。