Java中,可以模仿JDK中包装好的ArrayList类,自己构建一个顺序表,通过数组存储学生信息。在这个数组中,每个元素都可以存储一个学生的信息,包括学号、姓名和年龄。
import java.util.Arrays;
public class MyArrayList {
private static final int DEFAULT_CAPACITY = 10;
private Object[] elementData;
private int size;
public MyArrayList() {
this.elementData = new Object[DEFAULT_CAPACITY];
}
public MyArrayList(int initialCapacity) {
if (initialCapacity < 0) {
throw new IllegalArgumentException("Invalid capacity: " + initialCapacity);
}
this.elementData = new Object[initialCapacity];
}
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++) {
if (elementData[i] == null) {
return i;
}
}
} else {
for (int i = 0; i < size; i++) {
if (o.equals(elementData[i])) {
return i;
}
}
}
return -1;
}
public int lastIndexOf(Object o) {
if (o == null) {
for (int i = size - 1; i >= 0; i--) {
if (elementData[i] == null) {
return i;
}
}
} else {
for (int i = size - 1; i >= 0; i--) {
if (o.equals(elementData[i])) {
return i;
}
}
}
return -1;
}
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}
public Object get(int index) {
rangeCheck(index);
return elementData[index];
}
public Object set(int index, Object element) {
rangeCheck(index);
Object oldValue = elementData[index];
elementData[index] = element;
return oldValue;
}
public boolean add(Object e) {
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}
public void add(int index, Object element) {
rangeCheckForAdd(index);
ensureCapacityInternal(size + 1);
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = element;
size++;
}
public Object remove(int index) {
rangeCheck(index);
Object oldValue = elementData[index];
int numMoved = size - index - 1;
if (numMoved > 0) {
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
}
elementData[--size] = null;
return oldValue;
}
public boolean remove(Object o) {
if (o == null) {
for (int i = 0; i < size; i++) {
if (elementData[i] == null) {
fastRemove(i);
return true;
}
}
} else {
for (int i = 0; i < size; i++) {
if (o.equals(elementData[i])) {
fastRemove(i);
return true;
}
}
}
return false;
}
public void clear() {
for (int i = 0; i < size; i++) {
elementData[i] = null;
}
size = 0;
}
private void fastRemove(int index) {
int numMoved = size - index - 1;
if (numMoved > 0) {
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
}
elementData[--size] = null;
}
private void rangeCheck(int index) {
if (index >= size) {
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
}
private void rangeCheckForAdd(int index) {
if (index > size || index < 0) {
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
}
private void ensureCapacityInternal(int minCapacity) {
if (minCapacity - elementData.length > 0) {
grow(minCapacity);
}
}
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0) {
newCapacity = minCapacity;
}
if (newCapacity - Integer.MAX_VALUE > 0) {
throw new OutOfMemoryError();
}
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
class Student {
private String id;
private String name;
private String gender;
public Student(String id, String name, String gender) {
this.id = id;
this.name = name;
this.gender = gender;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Student{" + "id='" + id + "'" + ", name='" + name + "'" + ", gender='" + gender + "'" + '}';
}
}
public class Main {
public static void main(String[] args) {
MyArrayList list = new MyArrayList();
// 添加学生信息
list.add(new Student("001", "张三", "男"));
list.add(new Student("002", "李四", "女"));
list.add(new Student("003", "王五", "男"));
// 根据学号查找学生
String id = "002";
for (int i = 0; i < list.size(); i++) {
Student student = (Student) list.get(i);
if (id.equals(student.getId())) {
System.out.println("查找到学生:" + student.getName());
}
}
// 修改学生信息
String modifyId = "003";
for (int i = 0; i < list.size(); i++) {
Student student = (Student) list.get(i);
if (modifyId.equals(student.getId())) {
student.setName("赵六");
student.setGender("女");
}
}
// 删除学生信息
String deleteId = "001";
for (int i = 0; i < list.size(); i++) {
Student student = (Student) list.get(i);
if (deleteId.equals(student.getId())) {
list.remove(i);
}
}
// 输出列表中的所有学生信息
for (int i = 0; i < list.size(); i++) {
Student student = (Student) list.get(i);
System.out.println(student);
}
}
}
该程序的运行结果:
从结果中可以看出,该程序完成了添加“001”、“002”、“003”,查找“002”,修改“003”和删除“001”的操作。
下面详细讲解一下该程序的实现步骤。
该程序实现了一个简单的顺序表存储学生信息的功能,其中MyArrayList类是实现顺序表的关键,而Student类则是存储学生信息的数据结构。
在主函数中,我们首先创建了一个MyArrayList对象和一个Scanner对象。通过Scanner对象读取用户的输入,根据用户的选择进行相应的操作,包括添加学生信息、删除学生信息、修改学生信息和查找学生信息等。
用户输入学生信息时,我们使用了Student类来存储学生的学号、姓名和性别等信息,并将Student对象添加到MyArrayList对象中。删除、修改和查找学生信息时,我们遍历MyArrayList对象,通过学号来定位要操作的学生信息,然后进行相应的操作。
注意,在删除学生信息时,我们使用了MyArrayList类中的remove方法,该方法会将指定位置的元素删除并将后面的元素向前移动一位,同时将MyArrayList对象的大小减一。在修改学生信息时,我们只需要根据学号定位到要修改的学生信息,然后修改其姓名和性别即可。
在查找学生信息时,我们同样是遍历MyArrayList对象,通过学号来定位要查找的学生信息。如果找到了,则输出该学生的姓名;如果未找到,则输出提示信息。
那么如何整合增删查改操作呢?我们可以使用一个无限循环来实现程序的持续运行,直到用户选择退出程序。
以下是具体实现过程:
public static void main(String[] args) {
MyArrayList list = new MyArrayList();
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("请输入要进行的操作:1.添加学生信息 2.删除学生信息 3.修改学生信息 4.查找学生信息 5.退出");
int choice = scanner.nextInt();
scanner.nextLine();
switch (choice) {
case 1:
System.out.println("请输入学生学号:");
String id = scanner.nextLine();
System.out.println("请输入学生姓名:");
String name = scanner.nextLine();
System.out.println("请输入学生性别:");
String gender = scanner.nextLine();
list.add(new Student(id, name, gender));
System.out.println("添加成功!");
break;
case 2:
System.out.println("请输入要删除学生的学号:");
String deleteId = scanner.nextLine();
for (int i = 0; i < list.size(); i++) {
Student student = (Student) list.get(i);
if (deleteId.equals(student.getId())) {
list.remove(i);
System.out.println("删除成功!");
break;
}
}
break;
case 3:
System.out.println("请输入要修改学生的学号:");
String modifyId = scanner.nextLine();
for (int i = 0; i < list.size(); i++) {
Student student = (Student) list.get(i);
if (modifyId.equals(student.getId())) {
System.out.println("请输入新的学生姓名:");
String newName = scanner.nextLine();
System.out.println("请输入新的学生性别:");
String newGender = scanner.nextLine();
student.setName(newName);
student.setGender(newGender);
System.out.println("修改成功!");
break;
}
}
break;
case 4:
System.out.println("请输入要查找学生的学号:");
String searchId = scanner.nextLine();
for (int i = 0; i < list.size(); i++) {
Student student = (Student) list.get(i);
if (searchId.equals(student.getId())) {
System.out.println("查找到学生:" + student.getName());
break;
} else if (i == list.size() - 1) {
System.out.println("未找到该学生!");
}
}
break;
case 5:
System.out.println("程序已退出!");
return;
default:
System.out.println("输入有误,请重新输入!");
break;
}
}
}
在这个示例中,我们使用了Scanner类来读取用户的输入并根据用户的选择进行相应的操作。用户可以输入学生的学号、姓名和性别来添加学生信息,也可以输入学号来删除、修改、查找学生信息。当用户输入5时,程序退出。