学生管理系统2.0 (可对学生数组扩容)
1.用户可初始化数组长度,不够用时可以扩充数组容量。
尝试完成以下功能
实体类:
学生类:
id, 姓名,年龄,性别,成绩
需要使用数组保存学生信息
Student[] allStu
需要完成的方法
1. 根据学生的ID,找到对应的学生对象【完成】
2. 完成方法,添加新学生
3. 完成方法,删除指定ID的学生
4. 完成方法,展示数组中所有的学生信息
1.1包结构划分
包名规范:
1. 所有的单词全部小写
2. 不同的单词直接使用 . 隔开
3. 包结构其实对应的就是一个真实的目录结构
包结构的使用是为了在开发中让代码结构更加明确,更好管理,会慢慢接触到MVC设计模式。
MVC ==> Model Viewer Controller
目前学生管理系统需要的包【目前功能所需】
实体类 : 所有的实体类都会在一个包下
管理类 : 需要一个管理类来管理学生操作【核心】,需要一个包
主方法类 : 主方法
测试类: 测试功能,养成习惯,对于代码中的功能,写一个测试一个,今天会到用@Test
1.2 学生实体类
package com.wk.entity;
public class Student {
private int id;
private String name;
private int age;
private char gender;
private int score;
public Student() {}
public Student(int id, String name, int age, char gender, int score) {
super();
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
this.score = score;
}
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;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + ", gender=" + gender + ", score=" + score
+ "]";
}
}
1.3 管理类功能分析
管理类:
1. 数据的保存
2. 数据处理
CRUD 增删改查
数据的保存
明确使用的是一个Student类型的数据
Student[] allStus;
问题:
成员变量
使用一个成员变量数组来保存对应的数据,所有的内容都依赖于类对象的操作
来完成,而且每一个管理类对象中保存的数据都是不一样的。
目前的不一样,是为了更好的复用性,后来的数据一样,是为了数据的统一性
静态成员变量
不关有多少个类对象,当前数据有且只有一份!!!
复用问题!!!
当前管理类
功能后期是考虑复用的!!!
不管是数据的存储方式,数据的处理方式,都要需要考虑满足多种情况,多种方式。
1.4管理类构造方法
因为当前管理类内的成员变量是一个数组,当前构造方法需要对于保存学生信息的数组进行初始化操作。
1. 传入参数是一个学生数组 【不行】
2. 传入参数是一个数组容量 √
传入一个数组,操作性,包括安全性都是存在一定的隐患。操作性较差,用户需要提供真实管理数据的空间,繁琐,引用指向有可能导致数据丢失。
传入一个数组容量,用户操作自由度更高!!!方便!!!快捷!!!省心省事!!!
要求传入的参数是一个数组容量,有没有要求???
1. int
2. 非负
3. int类型的最大值
【补充】Java中数组容量范围是在int范围以内,要求数组容量不得超出int范围
Integer.MAX_VALUE - 8 为什么-8后面解释!!!
构造方法这里提供两种
1. 无参数构造方法
用户不用指定容量,我们给予用户一个初始化容量使用
2. 有参数构造方法
用户指定底层数组容量,要求数据在合理范围以内
代码如下:
package com.wk.manager;
import com.wk.entity.Student;
public class StudentManager {
private Student[] allStus = null;
private static final int DEFAULT_CAPACITY = 10;
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private int size = 0;
public StudentManager() {
allStus = new Student[DEFAULT_CAPACITY];
}
public StudentManager(int initCapacity) {
if (initCapacity < 0 || initCapacity > MAX_ARRAY_SIZE) {
System.out.println("Input Parameter is Invalid!");
System.exit(0);
}
allStus = new Student[initCapacity];
}
public boolean addStudent(Student student) {
if(size == allStus.length) {
grow(size + 1);
}
allStus[size] = student;
size+=1;
return true;
}
private void grow(int minCapacity) {
int oldCapacity = allStus.length;
int newCapacity = oldCapacity + oldCapacity / 2;
if(minCapacity > newCapacity) {
newCapacity = minCapacity;
}
if (newCapacity > MAX_ARRAY_SIZE) {
System.exit(0);
}
Student[] temp = new Student[newCapacity];
for (int i = 0; i < oldCapacity; i++) {
temp[i] = allStus[i];
}
allStus = temp;
}
private int findIndexById(int id) {
int index = -1;
for (int i = 0; i < size; i++) {
if (id == allStus[i].getId()) {
index = i;
break;
}
}
return index;
}
public void showAllStudents() {
for (int i = 0; i < size; i++) {
System.out.println(allStus[i]);
}
}
public boolean remove(int id) {
int index = -1;
for (int i = 0; i < size; i++) {
if (id == allStus[i].getId()) {
index = i;
break;
}
}
if (-1 == index) {
System.out.println("Not Found!");
return false;
}
for (int i = index; i < size - 1; i++) {
allStus[i] = allStus[i + 1];
}
allStus[size - 1] = null;
size -= 1;
return true;
}
public Student get(int id) {
int index = findIndexById(id);
return index > -1 ? allStus[index] : null;
}
}
2.单元测试
package com.wk.test;
import org.junit.Test;
import com.wk.entity.Student;
import com.wk.manager.StudentManager;
public class StudentTest {
@Test
public void test() {
StudentManager stm = new StudentManager(1);
stm.addStudent(new Student(1, "李明", 16, '男', 80));
stm.addStudent(new Student(2, "joker", 16, '男', 70));
stm.addStudent(new Student(3, "wk", 16, '男', 82));
stm.addStudent(new Student(4, "liuliu", 16, '男', 86));
stm.addStudent(new Student(5, "张三", 16, '男', 83));
stm.addStudent(new Student(6, "李四", 16, '男', 81));
stm.addStudent(new Student(7, "王五", 16, '男', 66));
stm.addStudent(new Student(8, "马克", 16, '男', 77));
stm.addStudent(new Student(9, "波罗", 16, '男', 99));
stm.addStudent(new Student(10, "Tony", 16, '男', 100));
stm.addStudent(new Student(11, "屎大颗", 16, '男', 100));
stm.addStudent(new Student(12, "kang", 16, '男', 67));
stm.addStudent(new Student(13, "jiro", 16, '男', 86));
Student student=stm.get(11);
System.out.println(student);
stm.remove(11);
stm.showAllStudents();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)