复杂对象数组练习——遍历和添加
【题目】
【思路】
要对题目进行拆分,一步一步进行分析
- 首先,这个题目首先要求我们做到创建长度为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;
}
}