B站零基础JAVA教程随堂题目-学生数组的增删改

109 阅读3分钟

题目位置: b站: BV17F411T7Ao (P94)

写这个的目的还是想督促自己坚持学习java, 不知道将来能不能坚持到能上手的程度

视频学习过程中弹幕里还是有很多零基础小伙伴说可能有的地方不能理解, 所以在这里贴上我的作业相互交流

本人是转行前端开发会写JS, 但java方面相当于是零基础的小弟

背景: 之前讲java数组的时候说java数组定好长度不能扩展长度; 所以这里我大部分方法都返回了新数组来覆盖之前的数组变量, 也还没有教说数组有没有其他方法,暂时只学了 .length 属性 和 [index] 存取

题目:

这边是看到题目后, 先暂停视频, 然后运用之前写JS的经验和在这套Java课程里已经学习到的java知识来写一次;

写完之后还是要继续往后看视频, 看看老师的讲解;

今天突发奇想来这里写个记录, 写完后加了特别多注释(哭瞎);

有任何问题老哥们可以指正呀~

学生类: 

Student.java

PS: 就是一个标注的javabean

package com.studentdemo1.www;

public class Student {
    private int id;
    private String name;
    private int age;

    public Student() {
    }

    public Student(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

测试类:

StudentTest.java

PS: 大部分方法都传入了students数组

package com.studentdemo1.www;

public class StudentTest {
    public static void main(String[] args) {
        // 声明题目中需要一个三个学生的数组
        Student[] students = new Student[3];
        // 给三个学生赋值
        Student stu1 = new Student(1, "小红", 18);
        Student stu2 = new Student(2, "小李", 19);
        Student stu3 = new Student(3, "小王", 20);
        // 注释掉 12 - 14中的一行或多行 可以出现 addStudent 的第二种情况
        students[0] = stu1;
        students[1] = stu2;
        students[2] = stu3;
        // 声明一个新学生用来加入
        Student newStu = new Student(4, "小张", 21); // 可以加入
        // Student newStu = new Student(3, "小张", 21); // 不可以加入;id重复
        // 调用加入学生的方法
        students = addStudent(newStu, students);

        System.out.println("新增后列表中的学生信息");
        showStudentsInfo(students);

        // 调用删除学生的方法
        // id==11 的学生不存在会输出删除失败
        // students = deleteStudent(11, students);
        // id==3 的学生存在 正常删除
        students = deleteStudent(3, students);
        System.out.println("删除后列表中的学生信息");
        showStudentsInfo(students);


        // 根据id查找学生
        // int id = 22;  // 找不到id== 22的学生
        int id = 4; // 找到id==4的学生 等等年龄去加一
        System.out.println("需要查找的学生id: " + id);
        // 获取id为指定id的index
        int idx = getStudentById(id, students);
        if (idx == -1) {
            System.out.println("没找到id为" + id + "的学生, 不做后续操作了");
        } else {
            students[idx].setAge(students[idx].getAge() + 1);
            System.out.println("指定学生年龄+1后的结果");
            showStudentsInfo(students);
        }
    }

    /*
     * 如果存在那么就返回一个新数组用来覆盖原数组
     * 入参:
     *  Student stu 准备加入数组的新学生对象
     *  Student[] stus 学生数组
     * 返回值:
     *  Student[] 返回一个新的数组;用来赋值给原数组
     * */
    public static Student[] addStudent(Student stu, Student[] stus) {
        // 先判断这个学生在原数组中是否存在
        if (existStu(stu, stus)) {
            System.out.println("加不了了, " + stu.getName() + "(id:" + stu.getId() + ")学生已经在数组中了");
            return stus;
        }
        /*
         * 新学生需要加入原数组中的哪一个位置获得需要加入
         * 情况1:
         *  如果有 [1, null, 3]的情况 那么把新的学生加入到第二个位置 [1,新,3]这样
         * 情况2:
         *  如果是 [1,2,3] 的情况 那么生成一个新的数组(长度为原数组+1); 返回[1,2,3,新]
         *  情况2只会在代码声明 new Student[n] 但是赋值个数少于n的情况下出现
         * */
        int idx = nullIdx(stus);
        if (idx == -1) {
            // -1 表示数组中没有
            Student[] newStus = new Student[stus.length + 1];
            for (int i = 0; i < stus.length; i++) {
                newStus[i] = stus[i];
            }
            // 在新数组的最后一位中加入新学生
            newStus[newStus.length - 1] = stu;
            System.out.println("添加" + stu.getName() + "成功");
            return newStus;
        } else {
            // 在为null的地方 加入新学生
            stus[idx] = stu;
            System.out.println("添加成功");
            return stus;
        }

    }

    /*
     * 这里返回一个布尔值表示这个学生是否存在在这个数组中
     *  入参:
     *  Student stu 需要判断是否存在的新的学生对象
     *  Student[] stus 学生数组
     * 返回值:
     *  boolean
     *  true: 存在
     *  false: 不存在
     * */
    public static boolean existStu(Student stu, Student[] stus) {
        for (int i = 0; i < stus.length; i++) {
            // 如果有id和相同的那么就是存在
            if (stus[i] != null && stus[i].getId() == stu.getId()) {
                return true;
            }
        }
        return false;
    }

    /*
     * 最开始构思的删除的时候是想着直接把 学生数组[index] 改为null
     * 后来做的时候想着添加都返回了新数组那干脆删除也返回新数组 -- 省事儿
     * 所以这里的代码应该不会出现null的情况 除非最开始students数组声明后有没赋值的项
     * 入参:
     *  Student[] stus 原来的学生数组
     * PS: 因为前端 array.findIndex 方法如果没找到对应项的时候会返回-1 所以这里没找到也返回了-1
     *     大概像这样
     *     let a = [1,2,3,4];
     *     a.findIndex((n)=> n == 5);   // -1
     *     a.findIndex((n)=> n == 4);   // 3
     * */
    public static int nullIdx(Student[] stus) {
        for (int i = 0; i < stus.length; i++) {
            if (stus[i] == null) {
                return i;
            }
        }
        return -1;
    }

    /*
     * 这里是删除数组中的某一个学生
     * (生成一个不包含指定id的数组返回出去赋值给代码中的students)
     * 入参:
     *  int id 删除学生的id
     *  Student[] stus 学生数组
     * 返回值:
     *  Student[] 返回一个新的数组;用来赋值给原数组
     * */
    public static Student[] deleteStudent(int id, Student[] stus) {
        for (int i = 0; i < stus.length; i++) {
            // id相同 那么就是找到了需要删除的学生
            if (stus[i].getId() == id) {
                // 找到了需要删除的学生可以把他的信息打到控制台
                System.out.println("需要删除的学生信息");
                System.out.println(stus[i].toString());
                // 到这里就是找到了我们需要删除的学生;接下来进行删除操作
                Student[] newStus = new Student[stus.length - 1];   // new了个新的学生数组 长度==老数组长度-1; 因为我们要删除其中一个学生
                // 这里遍历老数组 把所有 id!=入参id 的学生赋值给新学生数组
                for (int i1 = 0, newIdx = 0; i1 < stus.length; i1++) {  // newIdx 新数组的index;
                    if (stus[i1].getId() != id) {
                        /*
                         * 新数组赋值时 index不能用i1 用了有可能会超过新数组的长度界限; 比如
                         * 原数组是 [1,2,3]
                         * 我们要删除的是2
                         * 那么得到的新数组应该是
                         * [1,3]
                         * 新数组长度是2, 最大的index是1;
                         * 如果用了 i1 那么会出现 新数组[2] = 老数组[2]的情况, 实际我们期望的是 新数组[1] = 老数组[2];
                         * 所以我单独申明了个newIdx用来给新数组赋值
                         * */
                        newStus[newIdx] = stus[i1];
                        newIdx++;
                    }
                }
                return newStus;
            }
        }
        // 能执行到这里的话就是没找到想要删除的学生;
        System.out.println("没找到对应学生删除失败"); // 报个输出信息
        // 把原来的数组返回出去
        return stus;
    }

    /*
     * 根据id查询找到id为入参的学生在数组中的index
     * PS: 其实可以改一下 nullIdx 方法; 不过还是重新写一个吧
     * 入参:
     *  Student[] stus 原来的学生数组
     * 返回值:
     *  int id对应学生存在的index 不存在就是-1
     * */
    public static int getStudentById(int id, Student[] stus) {
        for (int i = 0; i < stus.length; i++) {
            if (stus[i].getId() == id) {
                return i;
            }
        }
        return -1;
    }

    /*
     * 打印当前的学生列表
     * */
    public static void showStudentsInfo(Student[] students) {
        for (int i = 0; i < students.length; i++) {
            System.out.println(students[i].toString());
        }
    }
}

(撒花 ~)

小度现在正在播放 --- <安静> 盛哲 推荐 ~

为啥不能发表情啊 NGA 都可以啊