z39506284305 发表于 2020-11-23 11:51

闭关修仙个把月研制成功的小玩意, 求批评,求优化

本帖最后由 苏紫方璇 于 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;
}
}


慕寻 发表于 2020-11-23 12:13

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}

chzhty001 发表于 2021-2-3 15:49

慕寻 发表于 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;
}

慕寻 发表于 2020-11-23 12:16

if,else if,else这种
简短逻辑的,推荐你使用map定义,在最上方定义map常量,当输入字符的时候直接用K,V的形式自动匹配,根据输入的K值,找到对应的V值。当然我说的这个不是绝对的,只是推荐,具体情况具体分析

z39506284305 发表于 2020-11-23 12:29

慕寻 发表于 2020-11-23 12:13
list判断是否为空,不能直接判断size=0,一个null的list,怎么拿到size呢,虽然list是new出来的,但是判断的 ...

说得对, 判空一会去用isEmpty()替换一下.
第二个size的问题也忽略了, 的确是把size()提出来这个习惯比较好{:1_893:}

kabengqi 发表于 2020-11-23 12:43

加油,我在精神上支持你

喻言家 发表于 2020-11-23 12:48

看不懂,不明觉厉,然后等着我能看懂的那天

woshicp 发表于 2020-11-23 12:51

不错,我是没那个耐心去写的

z39506284305 发表于 2020-11-23 13:44

woshicp 发表于 2020-11-23 12:51
不错,我是没那个耐心去写的

慢慢磨呗. 实在无聊了的时候, 打开开发工具写一会, 基本一周一回~

z39506284305 发表于 2020-11-23 13:45

喻言家 发表于 2020-11-23 12:48
看不懂,不明觉厉,然后等着我能看懂的那天

我写的不好,我图省事, 功能没拆碎

Java学者 发表于 2020-11-23 14:16

坚持就是胜利,加油:victory:
页: [1] 2 3 4 5
查看完整版本: 闭关修仙个把月研制成功的小玩意, 求批评,求优化