複雜對象數組練習——周遊和添加
【題目】
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLjhTZzQDO5EmM5QmNmZTY4UzNmRTZklDNxITN2cjN5UzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
【思路】
要對題目進行拆分,一步一步進行分析
- 首先,這個題目首先要求我們做到建立長度為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;
}
}