Java基础练习:学生管理系统(数组版)
为了复习和巩固前面所学习的知识,我做了这个练习,遇到了问题,加深了自己的一些理解。
本文适用于Java初学者,也欢迎大佬指正其中所包含的不足,谢谢!
如有疑问,请及时提出,或者私信我,
如有意向,也可私信加微信共勉!
这只是第一版,后面还会更新数据库的版本,敬请期待!
需求:设置一个学生管理系统
1.添加学生信息
2.显示学生信息
3.删除学生信息
4.修改学生信息
5.查看学生信息
6.排序
7.退出
数组版
思路:
1.设计一个数组,用来存储学生信息
2.创建一个student类,用来封装对象
3.使用switch/case条件分支语句来实现对数组内存储的信息进行选择操作模式
4.构建对应的方法用来操作数组中的数据
出现的异常
java.util.InputMismatchException
:在输入学号是,我错误的输入了名字(即字符),而nextInt()
方法只能输入整数,导致抛出此异常。ConcurrentModificationException
:在遍历数组时,使用数组的remove方法溢出元素。
遇到的问题
- 在修改student对象的值后,再次添加该对象进入数组,所得到的数组对象中的值是相同的
原因:
- 我们在new对象时,数组对象的id是唯一的,将对象add进入list中,放入list中的其实还是对象的应用,每次每次添加的student只是简单的set对象的额属性,set新的属性值, 而add进list中的对象还是同一个对象id,也就是同一个对象;
- 每次添加student对象,只是添加对象的应用,新的student覆盖掉之前的add对象,所以每次添加student对象,只会是最后一个设置的值
- 避免此状况,需要保证对象的应用是惟一的,即new新的对象
下面贴代码
Student.java
package cn.xlb;
/*
@author XiHai ShengGe
*/
public class Student {
private int number;
private String name;
private int grade;
public Student() {
}
public Student(int number, String name, int grade) {
this.number = number;
this.name = name;
this.grade = grade;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
@Override
public String toString() {
return "Student{" +
"number=" + number +
", name='" + name + '\'' +
", grade='" + grade + '\'' +
'}';
}
}
Manage.java
package cn.xlb;
import java.lang.reflect.Array;
import java.util.*;
/*
@author XiHai ShengGe
*/public class Manage {
public static void main(String[] args) {
//创建ArrayList数组用来存储数据
List<Student> students = new ArrayList<Student>();
//开始进行操作,避免程序使用一次后就退出
System.out.println("欢迎进入学生管理系统\n" +
"1.添加学生信息\n" +
"2.显示学生信息\n" +
"3.删除学生信息\n" +
"4.修改学生信息\n" +
"5.查询学生信息\n" +
"6.排序\n" +
"7.退出\n");
//创建Scanner对象,以免循环体中重复创建
Scanner s = new Scanner(System.in);
Manage manage = new Manage();
while (true) {
System.out.println("请输入你要进行的操作:");
int i = s.nextInt();
//使用switch/case方法模块化各种方法
switch (i) {
case 1:
manage.add(s, students);
break;
case 2:
show(students);
break;
case 3:
manage.del(s, students);
break;
case 4:
manage.update(s,students);
break;
case 5:
manage.inquire(s,students);
break;
case 6:
manage.sort(s,students);
break;
case 7:
System.exit(0);
break;
default:
System.out.println("请输入1~7之间的数");
}
}
}
/*
*添加学生信息
*
*/
public void add(Scanner s,List<Student> students) {
//创建Student对象,使得每一次所添加的student都不相同
Student student = new Student();
System.out.print("请输入需要添加的学号:");
int number = s.nextInt();
//注意排除学号相同的情况
boolean f = true;
if (students != null) {
for (Student stu : students) {
if (stu.getNumber() == number) {
f = false;
break;
}
}
}
if (f) {
student.setNumber(number);
System.out.print("请输入对应的姓名:");
student.setName(s.next());
System.out.print("请输入对应的成绩:");
student.setGrade(s.nextInt());
students.add(student);
System.out.println(students);
}else{
System.out.println("学号重复");
}
}
/*
*显示所有学生信息
*
*/
public static void show(List<Student> students) {
for (Student s : students) {
System.out.println("学号:" + s.getNumber() + "姓名:" + s.getName() + "成绩:" + s.getGrade());
}
}
/*
*删除学生信息
*
*/
public void del(Scanner s, List<Student> list) {
System.out.println("请输入需要删除的学生学号:");
int number = s.nextInt();
System.out.println("你是否要继续进行删除操作?(1是,2否)");
int i = s.nextInt();
if (i == 1) {
boolean flag = false;
//返回此列表中元素的迭代器。
Iterator<Student> iterator = list.iterator();
while (iterator.hasNext()){
Student student = iterator.next();
if (student.getNumber() == number) {
iterator.remove();
flag = true;
break;
}
}
if (flag) {
System.out.println("学号为" + number + "的学生信息已删除");
}else {
System.out.println("没有该学号对应的学生信息");
}
/*
//会出现ConcurrentModificationException异常
for (Student student : list) {
if (student.getNumber() == number) {
System.out.println("学号为"+ number + "的学生信息已删除");
list.remove(student);
} else {
System.out.println("没有该学号对应的学生信息");
}
}
*/
} else if (i == 2) {
System.out.println("已退出删除操作");
} else {
System.out.println("输入错误,已退出");
}
}
/*
*修改学生信息
*
*/
public void update(Scanner s,List<Student> list) {
boolean flag = false;
System.out.println("请输入要修改信息的学号:");
int number = s.nextInt();
for (Student student : list) {
if (student.getNumber() == number){
System.out.println("修改学号为" + number + "的学生信息");
System.out.print("修改姓名为:");
student.setName(s.next());
System.out.print("修改成绩为:");
student.setGrade(s.nextInt());
flag = true;
break;
}
}
if (flag){
System.out.println("修改完成");
}else {
System.out.println("输入学号有误");
}
}
/*
*查询学生信息
*
*/
public void inquire(Scanner s,List<Student> list) {
boolean flag = false;
System.out.println("请输入需要查询信息的学生学号");
int number = s.nextInt();
for (Student stu : list) {
if (stu.getNumber() == number){
System.out.println("学号:" + stu.getNumber() + "姓名:" + stu.getName() + "成绩:" + stu.getGrade());
flag = true;
break;
}
}
if (!flag){
System.out.println("所查询学号不存在");
}
}
/*
*排序
*
*/
public void sort(Scanner s,List<Student> list) {
System.out.println("请选择排序方法:1.按学号排序;2.按成绩排序");
int i = s.nextInt();
boolean flag = true;
//选择排序模式
switch(i){
case 1:
//冒泡排序
for (int j = 0; j < list.size()-1 && flag; j++) {
flag = false;
for (int k = 0; k < list.size()-j-1; k++) {
System.out.println(list.get(k).getNumber());
if ((Integer)list.get(k).getNumber() > (Integer)list.get(k+1).getNumber()){
//交换两个位置上的值
Student tp = list.get(k);
list.set(k,list.get(k+1));
list.set(k+1,tp);
flag = true;
}
}
}
show(list);
break;
case 2:
//冒泡排序
for (int j = 0; j < list.size()-1 && flag; j++) {
flag = false;
for (int k = 0; k < list.size()-j-1; k++) {
System.out.println(list.get(k).getGrade());
if ((Integer)list.get(k).getGrade() > (Integer)list.get(k+1).getGrade()){
//交换两个位置上的值
Student tp = list.get(k);
list.set(k,list.get(k+1));
list.set(k+1,tp);
flag = true;
}
}
}
show(list);
break;
default:
System.out.println("请输入1或2");
}
}
}