Java -数组的增加(扩容)方法add、删除(下标和数据)方法remove、查询方法get

本文详细介绍了一个自定义的MyList类,该类模仿Java集合框架中的ArrayList,实现了动态数组的功能,包括添加、删除、查询和获取当前存储数据量等核心方法。同时,通过创建Judge类重写equals方法,确保了数据比较的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设置一个类, 命名为 MyList 类中包含属性:Object[] element 方法有如下几个:

  1. 增加方法 add : 可以向数组属性中依次存储 Object,数组内容存满时,需实现动态扩容(详解在下面)。
  2. 删除方法 remove :可以根据数据或下标,从数组属性中删除Object 数据,删除后,数组后续元素需前移。
  3. 查询方法 get :方法传入下标,返回数组中指定下标的数据。
  4. 当前存储数据量 size : 获取当前存储的有效数据长度
  • 动态扩容详解:无需真正增加原数组的容量,只用将原内容复制到新的大数组,然后让原数组名称重新等于大数组即可。由于原数组数据在堆中,失去引用会被GC自动回收。

第一步

创建MyList类,包含数组属性Object[] element,紧接着写上各个方法和功能
public class MyList {
		//属性,创建的数组
		Object[] element;
		//规定数组初始长度,注意命名规范
		final int BEGAIN = 3;
		//构造无参方法
		public MyList(){}
		//构造有参方法
		public MyList(Object[] element) {
			this.element = element;
		}
		//Object[] element的getter,setter方法,可使用快捷键添加
		public Object[] getElement() {
			return element;
		}
		public void setElement(Object[] element) {
			this.element = element;
		}
		
		/*
		 * 1.	增加方法add:
		 * 		可以向数组属性中 依次 存储 Object,数组内容存满时,需实现动态扩容
		 * 
		 * 分析:
		 * 传入Object内容 和 数组当中非空的位置(若传入的是element.length-1,则说明该数组已满需要开辟新数组)
		 */
		public void add(String txet,int n) {
			if(n==element.length) {
				//数组已满则需要开辟新数组,长度为之前的2倍
				Object[] newElement = new Object[element.length*2];
				for(int i=0;i<element.length;i++) {
					//遍历把旧数组内容传递给新数组
					newElement[i] = element[i];
				}
				//把需要赋值的text赋值到新数组当中最后一个非空元素的后面
				newElement[element.length] = new String(txet);
				//将原始数组变为新数组
				element = newElement;
			}else {
				//输入未满,直接赋值到数组当中最后一个非空元素的后面
				element[n] = new String(txet);
			}
			
		}
		
		/*
		 * 2.	删除方法remove
		 * 		可以根据数据或下标,从数组属性中删除Object 数据,删除后,数组后续元素需前移
		 * 
		 * 分析:分为两种情况(使用多态)
		 * 1.输入下标。根据相关下标要求找到,赋值,移动即可
		 * 2.输入数据。使用equals的方法遍历找到与目标数据相同的数,找到以后重复查找下标的方法进行操作
		 *
		 */
		//输入下标类
		public void remove(Object[] element,int index) {
			if(index == element.length) {
				//当需要删除的下标为最后一个时,直接把最后一个元素赋值为null即可
				element[element.length-1] = null;
			}else {
				for(int i=index;i<element.length-1;i++) {
					//逐个把在下标为index后的数组向前移动一个
					element[i] = element[i+1];
				}
				if(element[element.length-1] != null) {
					//把最后一个元素赋值为null
					element[element.length-1] = null;
				}
			}
			
		}
		// 输入数据类
		public void remove(Object[] element,Object text) {
			RemoveEquals m1 = new Judge(text);
			RemoveEquals m2 = new Judge();
			for(int i=0;i<element.length;i++) {
				//为了在循环时能在找到目标数据前逐个输入测试
				m2.setText(element[i]);
				//调用equals方法查询是否有与目标数据相同的,这里的equals方法得重写
				if(m2.equals(m1)) {
					//找到与目标数据相同的元素
					if(i == element.length-1) {
						//该数据位于数组最后一个,直接赋值为null即可
						element[i] = null;
						break;
					}else {
						for(int j=i;j<element.length-1;j++) {
							//逐个把在下标为i后的数组向前移动一个
							element[j] = element[j+1];
						}
						if(element[element.length-1] != null) {
							//把最后一个元素赋值为null
							element[element.length-1] = null;
						}
					}
				}
			}
			
		}
		
		
		/*
		 * 3.	查询方法get
		 * 		方法传入下标,返回数组中指定下标的数据
		 * 分析:
		 * 获取下标后判断下标是否越界,没有越界直接返回对应的下标元素,越界返回false
		 *
		 */
		public Object get(Object[] element,int index) {
			if((index>=0) && (index<=element.length-1)) {
				//需要输出的下标在0-element.leng-1之间直接进行return
				return element[index];			
			}else {
				//需要输出的下标越界返回false
				return false;
			}
		}
		
		/*
		 * 4.	当前存储数据量 size
		 * 		获取当前存储的有效数据长度
		 * 分析:
		 * 遍历数组,当下标还未越界时遇到空的下标元素则return该下标(有效数据长度就是该下标)
		 * 当下标越界时,说明数组已满,return element.length即可
		 *
		 */
		public int size(Object[] element) {
			for(int i=0;i<=element.length-1;i++) {
				if(element[i]==null) {
					return i;
				}
			}
			return element.length;
		}		
		
		//遍历打印数组数据
		public void print() {
			for(int i=0;i<element.length;i++) {
				System.out.println(element[i]);
			}
		}	
}

第二步

创建一个提供equals方法使用的类,定义为Judge
//与MyList类在一个包里面
public class RemoveEquals {
		//构造无参方法
		public RemoveEquals() {
			super();
		}
		//构造有参方法
		public RemoveEquals(Object text) {
			super();
			this.text = text;
		}
		
		private Object text;
		//快捷键属性的getter,setter方法
		public Object getText() {
			return text;
		}
		public void setText(Object text) {
			this.text = text;
		}

		//快捷键属性的equals方法,相当于重写
		@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			if (getClass() != obj.getClass())
				return false;
			Judge other = (Judge) obj;
			if (text == null) {
				if (other.text != null)
					return false;
			} else if (!text.equals(other.text))
				return false;
			return true;
		}
		
}

第三步

构造测试类测试各个功能是否完善
//与MyList类、RemoveEquals类在一个包里面
public class MylistTest {

	public static void main(String[] args) {
		MyList e = new MyList();
		
		//定义原数组长度为2
		e.element = new Object[e.BEGAIN];
		
		//添加超过3个元素
		e.add("one", e.size(e.element));
		e.add("two", e.size(e.element));
		e.add("three", e.size(e.element));
		e.add("four", e.size(e.element));
		e.add("five", e.size(e.element));
		
		
		//遍历打印数组数据
		e.print();
		//获取数组下标为n的数据
		System.out.println(e.get(e.element, 3));
		
		//删除数组下标为n的元素
		e.remove(e.element, 2);
		//遍历打印数组数据
		e.print();
		
		//删除指定数据的数组
		e.remove(e.element, "two");
		//遍历打印数组数据
		e.print();
		

	}

}

有许多不足,待改进之地,不喜勿喷!

注:其中包得自己创建!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值