闭关修仙个把月研制成功的小玩意, 求批评,求优化
本帖最后由 苏紫方璇 于 2020-11-23 12:39 编辑写了一个管理系统,求优化
初次发帖,若有不当之处, 请删{:1_893:}
public class StudentManager {
public static void main(String[] args) {
ArrayList<Student> sList = new ArrayList<>();
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println();
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("-----------------输入对应序号,可选择对应功能,请输入:");
String str1 = scanner.nextLine();
if ("1".equals(str1)) {
addStudent(scanner, sList);
} else if ("2".equals(str1)) {
updateStudent(scanner, sList);
} else if ("3".equals(str1)) {
findAll(sList);
} else if ("4".equals(str1)) {
deleteStudent(scanner, sList);
} else if ("5".equals(str1)) {
System.out.println("-----------------您输入的序号是 5. 已退出系统.");
System.out.println("-----------------再见!-----------------");
break;
} else {
System.out.println("-----------------输入的序号有误, 已返回主菜单.");
System.out.println();
}
}
}
private static void deleteStudent(Scanner scanner, ArrayList<Student> sList) {
System.out.println("-----------------您输入的序号是 4. 已进入学生资料清理系统.");
if (sList.size() != 0) {
int count = 0;
int index = -1;
String id;
while (true) {
if (count == 0) {
System.out.println("-----------------请输入被删除学生的ID号, 若想放弃删除操作,请输入9527");
} else {
System.out.println("-----------------请重新输入被删除学生的ID号, 若想放弃删除操作,请输入9527");
}
id = scanner.nextLine();
if ("9527".equals(id)) {
System.out.println("-----------------取消删除操作. 返回主菜单.");
break;
} else {
for (int i = 0; i < sList.size(); i++) {
if (sList.get(i).getId().equals(id)) {
index = i;
break;
}
}
}
if (index != -1) {
sList.remove(index);
System.out.println("-----------------删除成功. 返回主菜单.");
break;
} else {
count++;
System.out.println("-----------------经查询, 此次输入ID号和系统中学生信息不匹配.");
}
}
} else {
System.out.println("-----------------系统中无数据,无法删除. 返回主菜单.");
}
}
private static void findAll(ArrayList<Student> sList) {
System.out.println("-----------------您输入的序号是 3. 已进入查看学生信息系统.");
if (sList.size() != 0) {
System.out.println("当前前系统内共有 " + sList.size() + " 名学生,信息如下:");
System.out.println("学生id号\t\t\t" + "学生姓名");
for (Student student : sList) {
System.out.println(student.getId() + "\t\t\t" + student.getName());
}
System.out.println("-----------------查询完毕,返回主菜单.");
} else {
System.out.println("-----------------经查询,系统内暂无数据.");
}
}
private static void updateStudent(Scanner scanner, ArrayList<Student> sList) {
System.out.println("-----------------您输入的序号是 2. 已进入学生信息变更系统.");
if (sList.size() != 0) {
System.out.println("-----------------请输入想要变更信息的学生id号,若要放弃变更请输入9527");
String id;
int count = 0;
int size;
while (true) {
id = scanner.nextLine();
if ("9527".equals(id)) {
System.out.println("-----------------放弃变更,返回主菜单.");
break;
}
for (int i = 0; i < sList.size(); i++) {
if (id.equals(sList.get(i).getId())) {
size = sList.size();
count++;
System.out.println("已获取到该生信息");
System.out.println("学生id号: " + id);
System.out.println("学生姓名: " + sList.get(i).getName());
System.out.println();
System.out.println("-----------------请为该生录入新的学生信息.");
sList.remove(i);
//通过判断原集合的长度, 来保证删除一个之后, 务必添加回一个, 才可以结束循环.
while (size != sList.size()) {
//保证修改之后的位置和之前一致, 比如1,2,3.对2修改, 保证修改后是 1,x,3
realAdd(scanner, sList, i, id);
}
break;
}
}
if (count == 0) {
System.out.println("!!!经查询,输入的id与系统中信息不匹配,无法变更,请重新输入id号,若要放弃变更请输入9527");
} else {
break;
}
}
} else {
System.out.println("-----------------经查询,系统内暂无数据.");
}
}
private static void addStudent(Scanner scanner, ArrayList<Student> sList) {
System.out.println("-----------------您输入的序号是 1. 已进入新生录入系统.");
realAdd(scanner, sList);
}
private static void realAdd(Scanner scanner, ArrayList<Student> sList, int index, String id) {
System.out.println("请输入学生姓名:");
String name = scanner.nextLine();
Student student = new Student(id, name);
sList.add(index,student);
System.out.println("-----------------更新成功. 返回主菜单.");
}
private static void realAdd(Scanner scanner, ArrayList<Student> sList) {
int number;
String id;
while (true) {
System.out.println("请输入学生id号:");
id = scanner.nextLine();
number = checkId(sList, id);
if (number == 0) {
break;
} else {
System.out.println("!!!该id号归属其他学生, 请重新输入学生id号:");
}
}
System.out.println("请输入学生姓名:");
String name = scanner.nextLine();
Student student = new Student(id, name);
sList.add(student);
System.out.println("-----------------录入完成. 返回主菜单.");
}
//通过id校验学生id是否存在----------返回值 1表示存在,0表示不存在
private static int checkId(ArrayList<Student> sList, String id) {
for (Student student : sList) {
if (id.equals(student.getId())) {
return 1;
}
}
return 0;
}
}
实体类代码如下:
public class Student {
private String id;
private String name;
public Student() {
}
public Student(String id, String name) {
this.id = id;
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return Objects.equals(id, student.id) &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(id, name);
}
@Override
public String toString() {
return "Student{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
list判断是否为空,不能直接判断size=0,一个null的list,怎么拿到size呢,虽然list是new出来的,但是判断的时候也是需要注意的,养成习惯。
for循环,在括号里不要用i<XX.size(),最好将集合的长度先定义出来,用前面定义的i和定义的集合长度去比较,因为如果list过长的情况下,实际上每一次循环,都会从list开头遍历一遍,计算size,再和定义的i进行比较,这样浪费性能。示例
for(int i=0,l=sList.size(); i<l; i++){xxxxxx} 慕寻 发表于 2020-11-23 12:13
list判断是否为空,不能直接判断size=0,一个null的list,怎么拿到size呢,虽然list是new出来的,但是判断的 ...
ArrayList的size()方法不会去遍历这个列表,list对象有一个属性就是size,size()方法只是返回了size的值,而不会去遍历的。这个值在add和remove的时候都会更新的
/**
* Returns the numbers of elements in this list.
*
* @Return the number of elements in this list.
*/
public int size() {
return size;
} if,else if,else这种
简短逻辑的,推荐你使用map定义,在最上方定义map常量,当输入字符的时候直接用K,V的形式自动匹配,根据输入的K值,找到对应的V值。当然我说的这个不是绝对的,只是推荐,具体情况具体分析 慕寻 发表于 2020-11-23 12:13
list判断是否为空,不能直接判断size=0,一个null的list,怎么拿到size呢,虽然list是new出来的,但是判断的 ...
说得对, 判空一会去用isEmpty()替换一下.
第二个size的问题也忽略了, 的确是把size()提出来这个习惯比较好{:1_893:} 加油,我在精神上支持你 看不懂,不明觉厉,然后等着我能看懂的那天 不错,我是没那个耐心去写的 woshicp 发表于 2020-11-23 12:51
不错,我是没那个耐心去写的
慢慢磨呗. 实在无聊了的时候, 打开开发工具写一会, 基本一周一回~ 喻言家 发表于 2020-11-23 12:48
看不懂,不明觉厉,然后等着我能看懂的那天
我写的不好,我图省事, 功能没拆碎 坚持就是胜利,加油:victory: