1.代码涉及知识点
2.项目大纲
3.需求
4.标准的JavaBean类—学生类
这里首先我们要先自己定义一个Student类,用来存放学生的属性,也就是学生的基本信息,比如:id,姓名,年龄,家庭住址等。相信大家已经对标准JavaBean的内容很熟悉了,private权限修饰符修饰,同时要用setter方法来为对应的私有属性进行设置值和getter方法来获取对应属性的值。可以用ptg插件一键生成标准的JavaBean类。
step1:使用private关键字,修饰成员变量(属性)。
step2:提供setter方法,用于对属性进行赋值。
public void set属性名(参数){
this.属性名 = 参数;
}
step3:提供getter方法,用于获取属性值。
public 属性值类型 get属性名(){
return this.属性名;
}
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;
}
/**
* 获取
* @return id
*/
public String getId() {
return id;
}
/**
* 设置
* @param id
*/
public void setId(String id) {
this.id = id;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
/**
* 获取
* @return address
*/
public String getAddress() {
return address;
}
/**
* 设置
* @param address
*/
public void setAddress(String address) {
this.address = address;
}
public String toString() {
return "Student{id = " + id + ", name = " + name + ", age = " + age + ", address = " + address + "}";
}
}
5.构造方法
1.添加功能
方法中传进来的参数是集合,我们先创建一个学生对象,再输入学生id。判断学生id是否唯一,这里要调用一下自己写的contains方法。如果id存在,则让用户重新输入。不存在则继续让用户输入学生的其他信息。同时最后把学生对象添加到集合当中。
//添加学生
public static void addStudent(ArrayList<Student> list) {
//利用空参构造先创建学生对象
Student stu = new Student();
Scanner sc = new Scanner(System.in);
String id = null;
while (true) {
System.out.println("请输入学生的id");
id = sc.next();
boolean flag = contains(list, id);
if (flag) {
//表示id已经存在,需要重新录入
System.out.println("id已经存在了,请重新录入");
} else {
//表示id不存在,表示可以使用
stu.setId(id);
break;
}
}
System.out.println("请输入学生的姓名");
String name = sc.next();
stu.setName(name);
System.out.println("请输入学生的年龄");
int age = sc.nextInt();
stu.setAge(age);
System.out.println("请输入学生的家庭住址");
String address = sc.next();
stu.setAddress(address);
//把学生对象添加到集合当中
list.add(stu);
//提示一下用户
System.out.println("学生信息添加成功");
}
contains方法
contains方法是布尔类型,所以我们需要返回true或者false。这里传进来的参数是集合和添加学生方法中输入的id。方法体中我们用到了equals方法判断id是否存在。
这里结尾处,多写了一个return getIndex(),这是另一个判断方法,后面再讲。
//判断id在集合中是否存在
public static boolean contains(ArrayList<Student> list, String id) {
//循环遍历集合得到里面的每一个学生对象
for (int i = 0; i < list.size(); i++) {
//拿到学生对象后,获取id并进行判断
Student stu = list.get(i);
String sid = stu.getId();
if (sid.equals(id)){
//存在,true
return true;
}
}
//不存在 false
return false;
//return getIndex(list,id) >= 0;
}
2.删除功能
这里我们先让用户输入学生id,再调用自己写的getIndex方法,得到索引。最后判断学生id是否存在,存在就删除,不存在就提示一句并返回初始菜单。
//删除学生
public static void deleteStudent(ArrayList<Student> list) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入要删除的学生的id:");
String id = sc.next();
//查询id在集合中的索引
int index = getIndex(list,id);
//对index进行判断
if ( index >= 0 ) {
//如果大于等于0,表示存在,直接删除
list.remove(index);
System.out.println("id为:" + id + "的学生删除成功");
} else {
//如果-1,就表示不存在,结束方法,回到初始菜单。
System.out.println("id不存在,删除失败");
}
}
getIndex方法
这里我们得到每一个学生对象的id,再将它与用户输入的id比较。因为getIndex是int类型的方法,所以如果相同说明存在,那么就返回索引。不相同就返回-1。
上面的contains方法调用这里的getIndex方法,原因是二者都为判断型方法,而在contains方法中调用了getIndex方法之后,只需要返回getIndex()是否大于等于0,是的话说明存在,因为getIndex返回-1时说明不存在。
这样做的好处是,提高了代码的复用性,简言之少写几行代码。
//通过id获取索引的方法
public static int getIndex(ArrayList<Student> list, String id){
//遍历集合
for (int i = 0; i < list.size(); i++) {
//得到每一个学生对象
Student stu = list.get(i);
//得到每一个学生对象的id
String sid = stu.getId();
//拿着集合中的学生id跟要查询的id进行比较
if ( sid.equals(id) ) {
//如果一样,那么就返回索引
return i;
}
}
//当循环结束之后还没有找到,就表示不存在,返回-1.
return -1;
}
3.修改功能
这里先让用户输入要修改的学生的id,然后调用getIndex方法判断id是否存在,不存在,则让用户重新输入。存在便获取要修改的学生对象,并对该学生对象的其他信息进行修改。
//修改学生
public static void updateStudent(ArrayList<Student> list) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入要修改的学生的id:");
String id = sc.next();
int index = getIndex(list,id);
while ( index == -1 ) {
System.out.println("要修改的id:" + id + "不存在,请重新输入:");
id = sc.next();
index = getIndex(list,id);
}
//当代码执行到这里,表示当前id是存在的。
//获取要修改的学生对象
Student stu = list.get(index);
//输入其他的信息并修改
System.out.println("请输入修改的学生姓名:");
String newName = sc.next();
stu.setName(newName);
System.out.println("请输入修改的学生年龄:");
int newAge = sc.nextInt();
stu.setAge(newAge);
System.out.println("请输入修改的学生家庭住址:");
String newAddress = sc.next();
stu.setAddress(newAddress);
System.out.println("学生信息修改成功");
}
4.查询功能
这里的判断我用了一个isEmpty()方法,其实和后面的注释中的size()方法是一样的。如果集合中没有学生对象就提示用户。如果有学生对象,就打印表头,再依次打印集合中的每一个学生对象。
//查询学生
public static void queryStudent(ArrayList<Student> list) {
if (list.isEmpty()) { // if ( list.size() == 0 ) {
System.out.println("当前无学生信息,请添加后再查询");
//结束方法
return;
}
//打印表头
//\t和空格是为了查询时数据对齐,更好看
System.out.println("id\t\t\t\t姓名 年龄 家庭住址");
//当代码执行到这里,表示集合中是有数据的
for (int i = 0; i < list.size(); i++) {
Student stu = list.get(i);
//\t和空格是为了查询时数据对齐,更好看
System.out.println(stu.getId() + "\t" + stu.getName() + "\t" + stu.getAge() + "\t " + stu.getAddress());
}
}
6.主方法
在主方法中,先打印初始菜单。然后让用户输入选择。用增强switch语句使代码更简洁,在case语句中调用和菜单相对应的方法。
这里因为要考虑到用户不可能只使用一次项目。所以用个while循环,同时退出循环有两种方法:
- 第一种是:给循环命名,这样直接break跳出指定的循环。
- 第二种是:
System.exit(0);
这行代码意思是停止虚拟机运行
- 在集合后面可以list.add();提前创建几个学生对象到数组中。
public static void main(String[] args) {
ArrayList<Student> list = new ArrayList<>();
loop: //给循环命名,便于后面break跳出指定循环
while (true) {
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("请输入您的选择:");
Scanner sc = new Scanner(System.in);
String choose = sc.next();
switch (choose) {
case ADD_STUDENT -> addStudent(list);
case DELETE_STUDENT -> deleteStudent(list);
case UPDATE_STUDENT -> updateStudent(list);
case QUERY_STUDENT -> queryStudent(list);
case EXIT -> {
System.out.println("退出");
break loop;
//System.exit(0); //停止虚拟机运行
}
default -> System.out.println("没有这个选项");
}
}
}
7.测试类完整代码
import java.util.ArrayList;
import java.util.Scanner;
public class StudentSystem {
//将case条件的1~5,改为用final修饰的字符串,这样提高代码的可读性。
//因为下面主方法是static修饰的,所以这里定义的字符串常量也要用static修饰,静态只能用静态。
public static final String ADD_STUDENT = "1";
public static final String DELETE_STUDENT = "2";
public static final String UPDATE_STUDENT = "3";
public static final String QUERY_STUDENT = "4";
public static final String EXIT = "5";
public static void main(String[] args) {
ArrayList<Student> list = new ArrayList<>();
loop: //给循环命名,便于后面break跳出指定循环
while (true) {
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("请输入您的选择:");
Scanner sc = new Scanner(System.in);
String choose = sc.next();
switch (choose) {
case ADD_STUDENT -> addStudent(list);
case DELETE_STUDENT -> deleteStudent(list);
case UPDATE_STUDENT -> updateStudent(list);
case QUERY_STUDENT -> queryStudent(list);
case EXIT -> {
System.out.println("退出");
break loop;
//System.exit(0); //停止虚拟机运行
}
default -> System.out.println("没有这个选项");
}
}
}
//添加学生
public static void addStudent(ArrayList<Student> list) {
//利用空参构造先创建学生对象
Student stu = new Student();
Scanner sc = new Scanner(System.in);
String id = null;
while (true) {
System.out.println("请输入学生的id");
id = sc.next();
boolean flag = contains(list, id);
if (flag) {
//表示id已经存在,需要重新录入
System.out.println("id已经存在了,请重新录入");
} else {
//表示id不存在,表示可以使用
stu.setId(id);
break;
}
}
System.out.println("请输入学生的姓名");
String name = sc.next();
stu.setName(name);
System.out.println("请输入学生的年龄");
int age = sc.nextInt();
stu.setAge(age);
System.out.println("请输入学生的家庭住址");
String address = sc.next();
stu.setAddress(address);
//把学生对象添加到集合当中
list.add(stu);
//提示一下用户
System.out.println("学生信息添加成功");
}
//删除学生
public static void deleteStudent(ArrayList<Student> list) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入要删除的学生的id:");
String id = sc.next();
//查询id在集合中的索引
int index = getIndex(list,id);
//对index进行判断
if ( index >= 0 ) {
//如果大于等于0,表示存在,直接删除
list.remove(index);
System.out.println("id为:" + id + "的学生删除成功");
} else {
//如果-1,就表示不存在,结束方法,回到初始菜单。
System.out.println("id不存在,删除失败");
}
}
//修改学生
public static void updateStudent(ArrayList<Student> list) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入要修改的学生的id:");
String id = sc.next();
int index = getIndex(list,id);
while ( index == -1 ) {
System.out.println("要修改的id:" + id + "不存在,请重新输入:");
id = sc.next();
index = getIndex(list,id);
}
//当代码执行到这里,表示当前id是存在的。
//获取要修改的学生对象
Student stu = list.get(index);
//输入其他的信息并修改
System.out.println("请输入修改的学生姓名:");
String newName = sc.next();
stu.setName(newName);
System.out.println("请输入修改的学生年龄:");
int newAge = sc.nextInt();
stu.setAge(newAge);
System.out.println("请输入修改的学生家庭住址:");
String newAddress = sc.next();
stu.setAddress(newAddress);
System.out.println("学生信息修改成功");
}
//查询学生
public static void queryStudent(ArrayList<Student> list) {
if (list.isEmpty()) { // if ( list.size() == 0 ) {
System.out.println("当前无学生信息,请添加后再查询");
//结束方法
return;
}
//打印表头
//\t和空格是为了查询时数据对齐,更好看
System.out.println("id\t\t\t\t姓名 年龄 家庭住址");
//当代码执行到这里,表示集合中是有数据的
for (int i = 0; i < list.size(); i++) {
Student stu = list.get(i);
//\t和空格是为了查询时数据对齐,更好看
System.out.println(stu.getId() + "\t" + stu.getName() + "\t" + stu.getAge() + "\t " + stu.getAddress());
}
}
//判断id在集合中是否存在
public static boolean contains(ArrayList<Student> list, String id) {
/* //循环遍历集合得到里面的每一个学生对象
for (int i = 0; i < list.size(); i++) {
//拿到学生对象后,获取id并进行判断
Student stu = list.get(i);
String sid = stu.getId();
if (sid.equals(id)){
//存在,true
return true;
}
}
//不存在 false
return false;*/
return getIndex(list,id) >= 0;
}
//通过id获取索引的方法
public static int getIndex(ArrayList<Student> list, String id){
//遍历集合
for (int i = 0; i < list.size(); i++) {
//得到每一个学生对象
Student stu = list.get(i);
//得到每一个学生对象的id
String sid = stu.getId();
//拿着集合中的学生id跟要查询的id进行比较
if ( sid.equals(id) ) {
//如果一样,那么就返回索引
return i;
}
}
//当循环结束之后还没有找到,就表示不存在,返回-1.
return -1;
}
}
8.分析
这个学生管理系统总体来说不是很难,但是在依次写方法的时候需要有一定的逻辑性。能提高我们对项目书写的逻辑。