吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6253|回复: 44
收起左侧

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

[复制链接]
z39506284305 发表于 2020-11-23 11:51
本帖最后由 苏紫方璇 于 2020-11-23 12:39 编辑

写了一个管理系统,求优化
           初次发帖,若有不当之处, 请删
[Java] 纯文本查看 复制代码
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;
    }
}



实体类代码如下:
[Java] 纯文本查看 复制代码
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;
}
}



免费评分

参与人数 3吾爱币 +8 热心值 +3 收起 理由
一尘不染 + 1 我很赞同!
卖菜小贩邪魅 + 1 + 1 我很赞同!
苏紫方璇 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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

免费评分

参与人数 2吾爱币 +1 热心值 +2 收起 理由
某神隐 + 1 热心回复!
HalaTest + 1 + 1 我很赞同!

查看全部评分

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的时候都会更新的
[Java] 纯文本查看 复制代码
/**
 * Returns the numbers of elements in this list.
 *
* [url=home.php?mod=space&uid=155549]@Return[/url] the number of elements in this list.
 */
public int size() {
    return size;
}

免费评分

参与人数 1吾爱币 +1 收起 理由
皮皮虾自己走 + 1 我很赞同!

查看全部评分

慕寻 发表于 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()提出来这个习惯比较好
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
坚持就是胜利,加油
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 18:38

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表