天天看點

複雜對象數組練習——周遊和添加複雜對象數組練習——周遊和添加

複雜對象數組練習——周遊和添加

【題目】

複雜對象數組練習——周遊和添加複雜對象數組練習——周遊和添加

【思路】

要對題目進行拆分,一步一步進行分析

  • 首先,這個題目首先要求我們做到建立長度為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;
    }
}