众所周知,ArrayList是调整数组非常好用的类!那么Java本身是自带ArrayList类的,而且也很实用。但是,今天我们要自己编写一个ArrayList类并测试,来实现对于数组的操作!
1.代码。
import java.util.Arrays;
public class ArrayList2023<T> {
T[] array;
int rear;
int DEFAULT_CAPACITY = 10;
public ArrayList2023(int capacity) {
if (capacity > 0) {
this.array = (T[]) new Object[capacity];
}
else if (capacity < 0) {
System.out.println("数组长度不能小于零,新建了默认长度的数组");
this.array = (T[]) new Object[DEFAULT_CAPACITY];
}
else if(capacity == 0)
{
this.array = null;
}
else{
throw new IllegalArgumentException("Tllegal Capaity: "+ capacity);
}
}
public ArrayList2023(T[]array,int rear)
{
this.array = array;
this.rear = rear;
}
public void AddElement(T element){
this.array[rear] = element;
rear ++;
}
public void removeElement(int index){
if(index < 0 || index > rear)
{
System.out.println("fault");
}
for(int i = index;i<rear;i++)
{
this.array[i] = this.array[i+1];
}
rear--;
}
public void set(int index, T element){
if(index<0 || index > rear) {
return;
}
array[index] = element;
}
public T get (int index){
if(index<0 || index > rear) {
return null;
}
System.out.println(array[index]);
return array[index];
}
public int size(){
System.out.println("数组的长度为:" + rear);
return rear;
}
public void isEmpty(){
if(rear == 0){
System.out.println("数组为空");
}
else{
System.out.println("数组不为空");
}
}
@Override
public String toString(){
String string = "";
for(int i = 0;i<rear;i++)
{
string = string + array[i].toString()+"\n";
}
return string;
}
}
这个代码包含了ArrayList类的基本操作,比如Add,Remove,get,set等方法。这些方法的实现属于“弱小”方法,虽有一定的容错率但容错率不是很高。相比于Java自带的”健壮“代码,还有发展的空间,但这个代码的测试效果还是喜人的!
2.测试代码
import java.util.ArrayList;
import java.util.Scanner;
public class ArrayList2023Test {
public static void main(String[] args) {
String name,id, quit = "continue";
Scanner scan = new Scanner(System.in);
ArrayList2023 arrayList2023 = new ArrayList2023(28);
Student student1 = new Student("厉害的" ,"王老师");
arrayList2023.AddElement(student1);
System.out.println(arrayList2023);
while(! quit.equals("quit")){
System.out.println("请输入学生的姓名学号: ");
name = scan.nextLine();
id = scan.nextLine();
student1 = new Student(name,id);
arrayList2023.AddElement(student1);
System.out.println("继续还是退出?输入quit以退出,任意以继续");
quit = scan.nextLine();
}
System.out.println(arrayList2023);
System.out.println("请输入要删除同学的序号: ");
int index = scan.nextInt();
arrayList2023.removeElement(index);
System.out.println("删除后的线性表的内容: ");
System.out.println(arrayList2023);
System.out.println("请输入要修改的同学的序号: ");
index = scan.nextInt();
System.out.println("请输入修改后的内容: ");
String element;
element = scan.nextLine();
element = scan.nextLine();
arrayList2023.set(index,element);
System.out.println(arrayList2023);
System.out.println("请输入要查找的同学的序号: ");
index = scan.nextInt();
arrayList2023.get(index);
int length;
length = arrayList2023.size();
arrayList2023.isEmpty();
}
}
测试效果:
(此为数组为空时的效果)
(此为数组不为空时的测试效果)
这样,我们自己编写的ArrayList类就完成了!!!!!
遇到的问题:
编写一个类最大的问题是什么!?
是要熬大夜?是要写断手?是要秃头?是要起名字?
都不是!!!!!
编写一个类最大的问题在于思路!
学习Java的过程中很容易有这样的错觉:看着全会,写了不对。
在这次编写ArrayList类的过程中,我深刻意识到了什么才叫”理解“。在编写前,我看Java库中的源代码时,基本意思也是可以理解的,每一步的目的也好效果也好,感觉自己都已经明白了,然后兴冲冲的创建一个空类去编辑......然后就没有然后了
最后还是在课上老师写完示范方法后才写完整个类。
过程中也有着优化部分,比如规避输出中的很多“Null”。
还有就是要记住方法中“return”就是关门了!不能再添加新的指令,若想输出要这样写:
这些问题都是要有记忆的,下次需要注意!
总而言之,这次作业真的让我备受打击,觉得自己的Java学习太low了,,,不过我觉得现在开始做出调整也应该还是来的及的。希望自己以后可以有更多的“创新力”。