天天看点

复杂对象数组练习——遍历和添加复杂对象数组练习——遍历和添加

复杂对象数组练习——遍历和添加

【题目】

复杂对象数组练习——遍历和添加复杂对象数组练习——遍历和添加

【思路】

要对题目进行拆分,一步一步进行分析

  • 首先,这个题目首先要求我们做到创建长度为3的数组,存储数据。在Java中,我们一般要来创建一个类,对数据进行封装和保存,并且要在主函数中将这些数据存放到一个数组中。创建的类中要对学生的学号,姓名,年龄进行分别的定义,并且要确保这些数据可以封装的同时可以对数据进行添加等修改。
  • 接着,我们要添加一个学生对象,还要对添加的这个对象进行唯一性判断。在这里我们要理清好顺序关系,我们要在确定添加的是唯一的对象的时候才能把这个加入进去。在添加之前我们还要确定我们这个三个长度的数组有没有存满,如果存满了还需要另外想办法把这个对象存进去。
  • 最后,要对所有的学生信息进行输出。这里是存放到数组中,所以只需要按照数组的输出方式进行遍历输出就行。

【代码实现】

第一步,创建对象数组,并且存储1~3名学生对象作为初始数据

**这是JavaBean类的创建,实现面向对象,因为对学生的id,name,age等内容进行了封装,所以用set,get来获取内容写入内容。这里构造了两个方法用来初始化,一个是由形参的,一个是没有形参的 **

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

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

    public Student() {
    }

    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;
    }
}
           

接下来是初始化三个对象,并且将这些存到对象数组中。这里应该注意对象数组的创建方式,跟普通数组的创建有一点差别,因为这个对象数组存的不是一个类型的内容,这里面有整形,字符串,还有浮点型。是按照Student这个类来创建的。

Student[] arr = new Student[3];

        Student s1 = new Student(0001, "AAA", 18);
        Student s2 = new Student(0002, "BBB", 19);
        Student s3 = new Student(0003, "CCC", 20);

        arr[0] = s1;
        arr[1] = s2;
        arr[2] = s3;
           

第二步,再次添加一个学生对象,并且要进行学号的唯一性判断

首先了一个对象为 s4 ,作为题目要求创建学生对象。

接着在主函数中,根据判断结果来确定是否存储这个新创建的对象到数组中

boolean flag = contains(arr, s4.getId());
        if (flag) {
            System.out.println("当前ID重复");
        } else {
            //不重复,存到数组中
        }
           

在接下来是创建了一个方法来专门判断这个数组的唯一性,当数组不唯一时,返回 true,当数组唯一时,返回false。在这个方法中,先是用循环把之前存放到对象数组中的内容提取出来,放到一个Student类型的std里暂时存储,接着把这儿std里面的内容拆开并用 std.getId 提取出学号(Id),然后用sid和放进来的id进行比较,如果相同则说明不唯一。返回true。如果一直到循环结束都没有找到相同的就要返回false,确定没有相同的学号了。

public static boolean contains(Student[] arr, int id) {
        for (int i = 0; i < arr.length; i++) {
            Student std = arr[i];
                int sid = std.getId();
                if (sid == id) {
                    return true;
                }
        }
        return false;
    }
           

但是当我们把这个方法仔细看一遍就会发现有一些问题,就是当我们创建的长度为3的数组的里面没有存满时就会出现问题。当运行到没有存放内容的时候就会拿NULL进行比较,这在Java中是不被允许的,会报错

复杂对象数组练习——遍历和添加复杂对象数组练习——遍历和添加

下面就要对这个问题进行修正

在判断是否存在学号相同之前,再加一个判断,用于判断是否当时数组为空,当数组不为空的时候再讲学号提取出来进行比较

public static boolean contains(Student[] arr, int id) {
        for (int i = 0; i < arr.length; i++) {
            Student std = arr[i];
            if (std != null) {
                int sid = std.getId();
                if (sid == id) {
                    return true;
                }
            }
        }
        return false;
    }
           

判断完唯一性后,要回到主函数中,此时还有一点没有完成,就是根据唯一性把对象存进对象数组中。这时问题产生:我们的数组已经存满,无法直接把这个存进数组中。面对着这种情况,可以创建一个新的数组,并且把这个旧数组的内容存储到新数组中,并且把新创建的对象加入到数组中。这种问题主要是在原有的数组已经满员的情况下,因此我们还要判断是否满员。

判断是否满员有一点思路,就是当数组满员的时候,就不会有空这种情况,所以我们只需要确定数组已经存放了多少内容并计数,让计数后的结果跟数组的长度进行比较,如果相同则说明数组已满,这事就要处理这个数组满员还要进一步存储的问题了。如果没有满员,就只需要把新建的对象放进原数组中就可以了

int count = getCount(arr);
            if (count == arr.length) {
                //已存满,创建新的数组,将旧数组的内容存到新但是数组中
                Student[] newArr = createArr(arr);
                newArr[count] = s4;
            } else {
                //未存满,直接存到旧的数组中
                arr[count] = s4;
            }
           

在主函数中确定了两种情况后就需要编写计数的一部分了,这个方法主要是利用循环计数,不为空的就加一。这里count不仅代表有多少个数组不是为空的,还可以作为存储时候的下标

public static int getCount(Student[] arr) {
        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            //Student std=arr[i];
            if (arr[i] != null) {
                count++;
            }
        }
        return count;
    }
           

第三步,对整个数组进行遍历输出

输出语句直接放进了判断长度里面,将新建的对象存进数组中后就可以输出了

if (count == arr.length) {
                //已存满,创建新的数组,将旧数组的内容存到新但是数组中
                Student[] newArr = createArr(arr);
                newArr[count] = s4;
                printArr(newArr);

            } else {
                //未存满,直接存到旧的数组中
                arr[count] = s4;
                printArr(arr);
            }
           
public static void printArr(Student[] arr) {
        for (int i = 0; i < arr.length; i++) {
            Student std = arr[i];
            if (std.getName() != null) {
                System.out.println(std.getId() + "," + std.getName() + "," + std.getAge());
            }
        }
    }
           

【总代码】

JavaBean类的代码

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

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

    public Student() {
    }

    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;
    }
}
           

Test类的代码

public class Main {
    public static void main(String[] args) {
        Student[] arr = new Student[3];

        Student s1 = new Student(1, "AAA", 18);
        Student s2 = new Student(2, "BBB", 19);
        Student s3 = new Student(3, "CCC", 20);

        arr[0] = s1;
        arr[1] = s2;
        arr[2] = s3;

        i        Student s4 = new Student(4, "DDD", 21);
        boolean flag = contains(arr, s4.getId());
        if (flag) {
            System.out.println("当前ID重复");
        } else {
            //不重复,存到数组中
            //要判断数组是否存满 存满就要开辟一个新的数组,把旧的数组和s4存到新数组中,未存满就要直接存到旧数组中
            int count = getCount(arr);
            if (count == arr.length) {
                //已存满,创建新的数组,将旧数组的内容存到新但是数组中
                Student[] newArr = createArr(arr);
                newArr[count] = s4;
                printArr(newArr);

            } else {
                //未存满,直接存到旧的数组中
                arr[count] = s4;
                printArr(arr);
            }
        }
    }



    public static void printArr(Student[] arr) {
        for (int i = 0; i< arr.length; i++) {
            Student std=arr[i];
            if (std!= null) {
                System.out.println(std.getId() + "," + std.getName() + "," + std.getAge());
            }
        }
    }

    public static Student[] createArr(Student[] arr) {
        Student[] newArr = new Student[arr.length + 1];
        System.arraycopy(arr, 0, newArr, 0, arr.length);
        return newArr;
    }

    //判断数组是否存满
    public static int getCount(Student[] arr) {
        int count = 0;
        for (Student student : arr) {
            //Student std=arr[i];
            if (student != null) {
                count++;
            }
        }
        return count;
    }

    //唯一性判断,判断ID
    public static boolean contains(Student[] arr, int id) {
        for (Student std : arr) {
            if (arr != null) {
                int sid = std.getId();
                if (sid == id) {
                    return true;
                }
            }
        }
        return false;
    }
}