定义一个长度为3的数组,并初始化3名学生对象,学号,姓名各不相同 学生属性:姓名,学号,年龄
要求: 1、添加一个学生对象,并进行学号唯一性判断
2、添加完成后遍历所有学生信息
3、通过id删除学生信息,如果不存在,则提示删除失败
4、删除完毕后,遍历所有学生信息
5、输入一个学生id,并查询是否存在该学生,如果存在则年龄+1
*****代码实现*****
public class StudentDemo {
public static void main(String[] args) {
//定义一个长度为3的数组,并初始化3名学生对象
Student[] arr = new Student[3];
Student s1 = new Student("01", "小红", 22);
Student s2 = new Student("02", "小白", 12);
Student s3 = new Student("03", "小蓝", 21);
arr[0] = s1;
arr[1] = s2;
arr[2] = s3;
//1、添加一个学生对象,并进行学号唯一性判断
//新建一个要添加的学生对象
Student s4 = new Student("04", "小绿", 11);
//判断id是否重复,重复无需添加
//不重复就添加
boolean flag = contains(arr, s4.getId());
if (flag) {
//id存在,无需添加
System.out.println("当前id已存在,请修改后,再进行添加");
} else {
//不存在,需要添加
//若数组已经存满---扩容
//若没有存满---直接添加
int count = getCount(arr);
if (count == arr.length) {
//已经存满
//创建大一点的新数组
Student[] newArr = creatNewArr(arr);
arr = newArr;
//2、添加并遍历所有学生信息
arr[count] = s4;
printArr(arr);
} else {
//没有存满
//假设数组为[s1,s2,null]
//2、添加并遍历所有学生信息
//那么getCount得到的是2,表示数组中存了2个元素,也表示下标为2的位置是null,那么下次赋值可以直接赋值到此位置
arr[count] = s4;
printArr(arr);
}
}
//3、通过id删除学生信息,如果不存在,则提示删除失败
//通过id查询索引
Scanner sc = new Scanner(System.in);
System.out.println("请输入要删除的id");
int index = getIndex(arr, sc.next());
if (index >= 0) {
//存在就删除---即赋予空值null
arr[index] = null;
if (getCount(arr) >= 3) {
for (int i = index; i < getCount(arr) + 1; i++) {
arr[i] = arr[i + 1];
}
arr[arr.length - 1] = null;
} else {
for (int i = index; i < args.length; i++) {
arr[index] = arr[index + 1];
}
}
System.out.println("删除后数组为:");
printArr(arr);
} else {
//如果不存在,则提示删除失败
System.out.println("id不存在,删除失败");
}
//5、查询id为输入值的学生,如果存在则年龄+1
System.out.println("请输入要修改的学生id:");
int indexDel = getIndex(arr, sc.next());
if(indexDel>0){
//存在,年龄+1
arr[indexDel].setAge(arr[indexDel].getAge()+1);
System.out.println("修改后的数组为:");
printArr(arr);
}else {
//不存在,返回修改失败
System.out.println("id不存在,修改失败");
}
}
//我要干嘛?---找到id对应的索引
//我需要什么?---数组,id
//调用出需要返回值吗?---需要,因为之后要根据索引删除信息
public static int getIndex(Student[] arr, String id) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] != null) {
if (id.equals(arr[i].getId())) {
return i;
}
}
}
//如果遍历完之后,没有找到,则返回-1,因为没有索引是负值
return -1;
}
//定义一个遍历方法
private static void printArr(Student[] arr) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] != null) {
System.out.println(arr[i].getId() + "," + arr[i].getName() + "," + arr[i].getAge());
}
}
}
//扩容
private static Student[] creatNewArr(Student[] arr) {
//创建一个新数组,长度为老数组的1.5倍,并向上取整后,强制转换为int
Student[] newArr = new Student[(int) Math.ceil(arr.length * 1.5)];
//将arr数组从0号位开始,复制给newArr,newArr从0号位开始接收,复制元素的个数为arr.length
System.arraycopy(arr, 0, newArr, 0, arr.length);
return newArr;
}
//定义一个方法判断数组中已经存了几个元素
public static int getCount(Student[] arr) {
int iCount = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] != null) {
iCount++;
}
}
return iCount;
}
//我要干嘛?---唯一性判断
//做这件事需要什么?---数组,id
//调用处是否需要继续使用方法的返回结果?---必须返回
public static boolean contains(Student[] arr, String id) {
//依次获取数组里的学生对象,
for (int i = 0; i < arr.length; i++) {
Student stu = arr[i];
//如果stu为null,则stu.getId会报错
if (stu != null) {
if (id.equals(stu.getId())) {
return true;
}
}
}
//循环结束后,还没找到,才return false
return false;
}
}
运行结果:



