一、面向对象高级训练任务
2、数组增删查案例
问题描述
设置一个类, 命名为 MyList 类中包含属性:Object[ ] element 方法有如下几个:
- 增加方法 add : 可以向数组属性中依次存储 Object,数组内容存满时,需实现动态扩容(详解在下面)。
- 删除方法 remove :可以根据数据或下标,从数组属性中删除 Object 数据,删除后,数组后续元素需前移。
- 查询方法 get :方法传入下标,返回数组中指定下标的数据。 当前存储数据量 size : 获取当前存储的有效数据长度
动态扩容详解:无需真正增加原数组的容量,只用将原内容复制到新的大数组,然后让原数组名称重新等于大数组即可。由于原数组数据在堆中,失去引用会被 GC 自动回收。
解题思路
增加方法add时,题意很清晰要求动态扩容,所以得考虑两个问题:(1)竟然要创建新数组,那新数组最大容量是多少呢?——最大容量capacity (2)添加新的元素时,那它要放到新数组哪个位置呢?——实际数组长度size…
代码
MyList.java
public class MyList {
//属性
private Object[] element;//盛放元素的数组
private int capacity;//容量
private int size;//实际大小
//构造方法
public MyList() {
size=0;//实际大小默认就是0
capacity=4;//默认容量--可以自己定义
element=new Object[capacity];//分配数组的空间--数组的空间一定开辟就不能改变大小
}
//方法
/**
* 添加元素
* @param obj
*/
public void add(Object obj) {
if(size>=capacity){
//数组内容是否存满,满了之后需要扩容
//动态扩容
Object[] newArr=new Object[capacity*2];//新数组的大小可以自己决定,比原来大就可以
//将原有数组的元素复制到新的数组中
for (int i = 0; i < element.length; i++) {
newArr[i]=element[i];
}
//让原数组名称重新等于新数组即可
element=newArr;
}
element[size]=obj;//存放元素
size++;//实际大小+1
}
/**
* 根据指定的对象删除
* @param obj
* @return
*/
public Object remove(Object obj) {
//先判断该对象是否存在
for (int i = 0; i < element.length; i++) {
if(element[i]!=null && obj==element[i]) {
return remove(i);
}
}
return null;//该数组中没有要删除的对象
}
/**
* 根据下标删除
* @param index
* @return
*/
public Object remove(int index) {
//如果是最后一个元素
if(index==size-1) {
size--;
return element[index];//返回被删除的数值
}
//数组后续元素需前移
Object obj=element[index];
for(int i=index;i<size;i++) {
element[i]=element[i+1];
}
size--;//删除成功之后实际大小要-1
return obj;//返回被删除的数值
}
/**
* 查询方法
* @param index
* @return
*/
public Object get(int index) {
return element[index];
}
public int getSize() {
return size;
}
}
MyListTest.java
public class MyListTest {
public static void main(String[] args) {
MyList list = new MyList();
//添加元素
for (int i = 0; i < 5; i++) {
list.add("爱摸鱼的TT~"+i);
}
String s="爱摸鱼的TT~";
String s1="爱摸鱼的TT";
list.add(s);
//删除元素
Object obj=list.remove(s1);
System.out.println("删除的元素:"+obj);
//获取元素
for (int i = 0; i < list.getSize(); i++) {
System.out.println(list.get(i));
}
}
}
运行结果:
动态扩容
无需真正增加原数组的容量,只用将原内容复制到新的大数组,然后让原数组名称重新等于大数组即可。由于原数组数据在堆中,失去引用会被 GC 自动回收。